Dart基础系列之重要概念

作者: 树獭非懒 | 来源:发表于2018-10-28 19:47 被阅读21次
    核心内容
    • 最基础的Dart程序
    • Dart一些重要的概念
    • KeyWord(关键字)
    • Variable(变量)
    • Final&&Const
    • Dart的内置类型

    最基础的Dart程序

    先看一个最基础的Dart程序

    void log(Object object) {
      print(object.toString());
    }
    
    /// Returns a Boolean representation for [arg], which must
    /// be a String or bool.
    bool convertToBool(dynamic arg) {
      if (arg is bool) return arg;
      if (arg is String) return arg == 'true';
      throw ArgumentError('Cannot convert $arg to a bool.');
    }
    

    上面的代码写出了Dart最基本的一些特性。

    以下的东西基本会出现在所有的Dart程序中

    int
    一种类型。其他一些内建类型还有是Sting, list,和bool等

    42
    数字,一个编译时的常数.

    print()
    显示输出的print方法。

    '...'(或"...")
    字符串文本

    $variableName或${表达方式}
    

    字符串插值:在字符串文本中包含一个变量或表达式的字符串等效的字符串。

    main()
    应用程序执行开始的顶级方法

    var
    一种在不指定变量类型的情况下声明变量的方法。

    Dart一些重要的概念

    (1)与Java不同,Dart没有公开、受保护和私有的关键字。如果标识符以下划线(_)开头,则它对其库是私有的。

    (2)标识符可以字母或下划线(_)开头,后面跟着这些字符的任何组合加上数字

    (3)DART工具可以报告两种问题:警告和错误。警告只是表明您的代码可能无法工作,但它们并不妨碍您的程序执行。错误可以是编译时,也可以是运行时。编译时错误完全阻止代码执行;运行时错误导致在执行代码时引发异常。

    (4)DART有表达式(有运行时值)和语句(没有)。例如,条件表达式条件?expr1:expr2的值为expr1或expr2。将其与没有值的if-etc语句进行比较。语句通常包含一个或多个表达式,但表达式不能直接包含语句。

    (5)虽然DART是强类型的,但类型注释是可选的,因为DART可以推断类型。在上面的代码中,number推断为类型INT。当您想明确表示不需要任何类型时,使用特殊类型dynamic.

    (6)DAT支持泛型类型,如List<int>(整数列表)或List<dynamic>(任何类型的物体的清单)。

    (7)DART支持顶级函数(如main()),以及绑定到类或对象的函数(静态和实例方法分别)。您还可以在函数中创建函数(巢式或局部函数).

    '...'(或"...")表示字符串文字

    KeyWord(关键字)

    避免使用这些词作为标识符。但是,如果有必要,标记上标的关键字可以是标识符,但是表中的其他单词是保留字不能作为是标识符

    keyword.png
    1. 上标词1是语境关键词,只有在特定的地方才有意义。到处都是有效的标识符。
    2. 上标词2是内置标识符。为了简化将JavaScript代码移植到DART的任务,这些关键字在大多数地方都是有效的标识符,但它们不能用作类名或类型名称,也不能用作导入前缀。
    3. 上标词3是与异步支持这是在Dart的1.0版本之后添加的。你不能用await或yield作为标识符,在任何被标记为async, async,或sync.

    Variable(变量)

    创建变量有三种方式

    String name = 'Bob';
    var name = 'Bob';
    dynamic name = 'Bob';
    
    

    (1)String很简单,就是显式声明变量类型是String类型

    (2)var表示name变量可以根据值('Bob')从而推断出它的类型(String)

    (3)如果对象不限于单个类型,就使用dynamic关键字,指定对象为dynamic类型

    变量的默认值

    比如语句:
    int a;

    那么它的默认值就是null,并不是0。
    int类型的变量和Dart中的其他所有一切都是对象

    Final&&Const

    Final变量必须要给个初始值,并且给定后,就不能再次赋值给该变量

    final name = 'Bob'; // Without a type annotation
    final String nickname = 'Bobby';
    

    再次赋值会报错

    name = 'Alice'; // Error: a final variable can only be set once.
    

    Const变量是编译时常量.(Const变量是隐式最终变量。)第一次使用时,将初始化最后一个顶级变量或类变量。
    如果const变量位于类级别,则标记它为static const

    const bar = 1000000; // Unit of pressure (dynes/cm2)
    const double atm = 1.01325 * bar; // Standard atmosphere
    

    不仅用于声明常量变量。您也可以使用它来创建常量值,以及声明构造函数创造常数值任何变量都可以有一个常量值。

    var foo = const [];
    final bar = const [];
    const baz = []; // 等同于const [] 
    

    注意:可以省略常量的初始化表达式常量声明

    可以改变不是final、const修饰的变量,即使它被赋值过const常量

    例如修改上述的var foo

    foo = [1, 2, 3]; // Was const []
    

    不能改变一个const常量的值,例如修改上述的const baz,就会报错

    baz = [42]; // Error: Constant variables can't be assigned a value.
    

    内置类型

    DART语言支持以下数据类型

    1. numbers
    2. strings
    3. booleans
    4. lists (also known as arrays)
    5. maps
    6. runes (for expressing Unicode characters in a string)
    7. symbols
    (一)numbers

    Dart的numbers有两种形式

    一个是int,它的整数值不大于64位,具体范围取决于平台。在dart vm上,值可以是
    -2^63 至 2^63-1 。编译为JavaScript的DART使用JavaScript数字允许-2^53 至2^53-1

    另一个是double。64位双精度浮点数,由IEEE 754标准指定

    int和double支持基本的加减乘除运算,也可以找到abs()、ceil()和floor()其他方法。如果一些方法在int和double类里面没有找到,那么在dart::math库里面或许可以找到

    int x = 1;
    int hex = 0xDEADBEEF;
    
    double y = 1.1;
    double exponents = 1.42e5;
    

    字符串转数字的方法

    // String -> int
    var one = int.parse('1');
    assert(one == 1);
    
    // String -> double
    var onePointOne = double.parse('1.1');
    assert(onePointOne == 1.1);
    
    // int -> String
    String oneAsString = 1.toString();
    assert(oneAsString == '1');
    
    // double -> String
    String piAsString = 3.14159.toStringAsFixed(2);
    assert(piAsString == '3.14');
    
    (二)String

    DART字符串是一个UTF-16码单元的序列.可以使用单引号或双引号创建字符串:

    var s1 = 'Single quotes work well for string literals.';
    var s2 = "Double quotes work just as well.";
    

    可以将表达式的值放入字符串中,方法是${表达}。如果表达式是标识符,则可以跳过{}。要获取与对象对应的字符串,DAT调用对象的字符串toString()方法。

    var s = 'string interpolation';
    
    assert('Dart has $s, which is very handy.' ==
        'Dart has string interpolation, ' +
            'which is very handy.');
            
    assert('That deserves all caps. ' +
            '${s.toUpperCase()} is very handy!' ==
        'That deserves all caps. ' +
            'STRING INTERPOLATION is very handy!');
    

    ==操作符表示判断两个对象是否相等

    相邻的多个字符串会自动拼成一个字符串,或者使用”+”拼装

    var s1 = 'String '
        'concatenation'
        " works even over line breaks.";
    assert(s1 ==
        'String concatenation works even over '
        'line breaks.');
    
    var s2 = 'The + operator ' + 'works, as well.';
    assert(s2 == 'The + operator works, as well.');
    

    注意:文字字符串要求是编译时常量,只要任何内插表达式是编译时常量,比如说结果是为NULL或数值或字符串或布尔值。

    //这些是可以内嵌到字符串中的
    const aConstNum = 0;
    const aConstBool = true;
    const aConstString = 'a constant string';
    
    // 这些不能内嵌到字符串中
    var aNum = 0;
    var aBool = true;
    var aString = 'a string';
    const aConstList = [1, 2, 3];
    
    const validConstString = '$aConstNum $aConstBool $aConstString';
    // const invalidConstString = '$aNum $aBool $aString $aConstList';
    
    (三)Booleans

    为了表达布尔值,Dart把类型命名为bool,有两种类型值,true和false,他们都是编译时常量。

    注意:DART的类型安全性意味着您不能使用以下代码if(nonbooleanValue)或assert(nonbooleanValue),我们需要显式地检查值

    例如

    // Check for an empty string.
    var fullName = '';
    assert(fullName.isEmpty);
    
    // Check for zero.
    var hitPoints = 0;
    assert(hitPoints <= 0);
    
    // Check for null.
    var unicorn;
    assert(unicorn == null);
    
    // Check for NaN.
    var iMeantToDoThis = 0 / 0;
    assert(iMeantToDoThis.isNaN);
    
    (四)List

    大多数编程语言中的集合都是数据或者对象组。在dart里面数组就是list对象

    Dart list就像JavaScript数组文本。下面是Dart的一个简单list

    var list = [1, 2, 3];
    

    分析器推断list有型List<int>。如果尝试向此列表添加非整数对象,分析器或运行时将引发错误。list的索引从0开始,即0是第一个元素的索引

    list[1] = 1;
    assert(list[1] == 1);
    

    List类型支持很多操作list的方法,不可以像数组赋值那样直接对元素赋值

    var constantList = const [1, 2, 3];
    // constantList[1] = 1; // Uncommenting this causes an error.
    
    (五)Map

    可以使用Map构造方法创建对象

    var gifts = Map();
    gifts['first'] = 'partridge';
    gifts['second'] = 'turtledoves';
    gifts['fifth'] = 'golden rings';
    
    

    我们发现没有new Map(),在Dart 2里new关键字是可选的。

    向现有的映射中添加元素

    var gifts = {'first': 'partridge'};
    gifts['fourth'] = 'calling birds'; // Add a key-value pair
    

    从映射中查询值

    var gifts = {'first': 'partridge'};
    assert(gifts['first'] == 'partridge');
    

    要获取映射中键值对的数目,使用.length

    var gifts = {'first': 'partridge'};
    gifts['fourth'] = 'calling birds';
    assert(gifts.length == 2);
    
    (六)Runes

    在DART中,runes表示字符串的UTF-32编码

    Unicode为所有世界上的书写系统中使用的每个字母、数字和符号定义一个唯一的数字值。由于DART字符串是由UTF-16代码单元组成的序列,因此在字符串中表示32位Unicode值需要特殊的语法。
    通常表示Unicode代码点的方法是\uXXXX,其中XXXX是一个4位的十六进制值。例如,爱心字符(♥)是\u2665。

    String类具有几个可用于提取符文信息的属性,codeUnitAt和codeUnit属性返回16位代码单元。使用runes属性获取字符串的符文。

    例如

    main() {
      var clapping = '\u{1f44f}';
      print(clapping);
      print(clapping.codeUnits);
      print(clapping.runes.toList());
     
      Runes input = new Runes(
          '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
      print(new String.fromCharCodes(input));
    }
    
    

    运行结果是这样

    runes.png
    (七)Symbols

    Symbol对象表示在Dart程序中声明的运算符或标识符。您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号。要获取标识符的符号,请使用符号文字,它只是#后跟标识符:

    #radix
    #bar
    

    这个很不常用,暂时可以忽略.....

    这里的很多内容都只是大概介绍个基础点,里面的每个部分都还有很多知识点细节需要学习,在之后的系列会慢慢展开来说。

    漫漫人生路,偶尔还是要喝点有营养的鸡汤的

    人生都是走着走着就开阔了,现在的你,不用着急。让未来的,本该属于你的树再长长,那些花再开开,等你遇见的时候,才是他们最美的时候。

    相关文章

      网友评论

        本文标题:Dart基础系列之重要概念

        本文链接:https://www.haomeiwen.com/subject/imemtqtx.html