返回首页 - Notes - 2018

学习 Dart 2


基本概念

一切皆对象,所有的对象最终都继承自 Object 类。每个对象都有一个名为 runtimeType 的属性,可以获知对象所属的类型

强类型语言,但是在有些时候可以省略类型说明,编译器能自行推断出类型

语句末尾不能省略分号

没有 publicprotectedprivate 关键字,如果一个标识符的名字以 _ 开头,则该标识符对于其所在包来说就是私有的

数值类型包括 intdouble,两者都是 num 的子类型

布尔值包括 truefalse,除了 true 以外的其他值都为假

字符串转数字的方法:int.parse('1')double.parse('1.23')

数字转字符串的方法:1.toString()1.2345.toStringAsFixed(2)

单引号字符串和双引号字符串都支持变量内插,语法为 美元符+变量名美元符+{表达式}

使用 + 号连接两个字符串;可以用三个单引号或双引号字符串的形式,创建多行字符串;使用 r'字符串' 的形式可以创建不支持转义字符的字符串

在标识符前面加个 # 号就能拿到对应的 Symbol

定义方法时,用 {} 声明可选的命名参数,用 [] 声明可选的位置参数,{}[] 貌似不能同时使用

程序的入口是 main 函数,可用一个 List<String> 类型的变量接收命令行参数

函数是一等公民,可以传递,可以嵌套定义

所有的函数都有返回值,如果没有明确指定,则默认返回 null

拥有默认值赋值操作符 ??=name ??= 'Ruchee' 的意思是,如果 name 等于 null,则赋值为 Ruchee

内建级联调用操作符 ..,实质上就是每次调用都会返回原对象,其他语言也可以自己实现,只是 Dart 内建了这么个符号

拥有安全的对象调用操作符 ?.,只有前面那个对象不为 null 时才会调用后面的属性或方法。Ruby 也有这样的操作符,只是写作 &.


异常处理

提供了常规的 throw - try - catch - finally 流程,但是增加一些新的概念

使用 throw 抛出异常

使用 on 捕获具体的异常类型

使用 catch 捕获异常对应的消息体

可以使用 rethrow 重新抛出未处理完成的异常

使用 finally 执行异常处理的清理工作


面向对象

与类名同名的函数,即为该类的构造函数

如果构造函数只是简单的属性赋值,则可以只写参数体,不需要写函数内容。下面两种写法等价

// 写法一
class Point {
  num x, y;

  Point(num x, num y) {
    this.x = x;
    this.y = y;
  }
}

// 写法二
class Point {
  num x, y;

  Point(this.x, this.y);
}

在类里面,同样使用 this 代指当前对象

如果没有给类提供构造函数,将在它父类的基础上调用无参的默认构造函数

构造函数不会被子类继承

可以给类自定义多个命名的构造函数,在构造函数前面加上类名和点号即可,示例如下:

class Hello {
  String name, email;

  // 默认构造函数
  Hello(this.name) {}

  // 自定义构造函数1
  Hello.sample1(this.name) {}

  // 自定义构造函数2
  Hello.sample2(this.name, this.email) {}

  sayHello() {
    print("Hello ${this.name} and your email is ${this.email}");
  }
}

main() {
  var h1 = new Hello('Ruchee');
  var h2 = new Hello.sample1('Ruchee');
  var h3 = new Hello.sample2('Ruchee', 'my@ruchee.com');

  h1.sayHello();
  h2.sayHello();
  h3.sayHello();
}

异步支持

提供了 asyncawait 关键字,await 必须在标注了 async 的函数中才能使用

await ... 返回的是一个 Future 对象


date:2018-05-06、2018-05-07