dart学习笔记

74 阅读2分钟

1 变量

1.1 late

late标记表示该变量将会延迟初始化,并且该变量的值不会是null,否则会引发运行时错误。late变量需要手动保证在初始化后使用,否则会引起运行时错误。此外,late变量也可以在声明的时候初始化,但是该初始化语句会在首次使用变量时才会运行。

// 该函数会在首次使用该变量时才运行
late var foo = heavyCost();
// 其他代码...
// 到此处才会运行heavyCost
print(foo);

1.2 final 和 const

1.2.1 final

final与js的const类似,表示常量,但是是运行时常量,也就是编译期不能确定值

1.2.2 const

dart的const表示编译期常量,即在编译期就可完成求值的变量。const既可修饰变量又可修饰值,被const修饰之后对象的字段不能改变。此外,只要被const修饰的变量或值的字面量一致,那么他们的引用就是相同的

// 在运行时运行getNum函数才能确定foo的值
final foo = getNum();

// 在编译期即可确定bar的值
const bar = [1, 2];
// error, 不能更改bar的字段
bar[0] = 2;

var baz = const [1, 2];
// 此时baz和bar引用了同一个数组对象
print(baz == bar); // true
// error, 同样的,此时baz的字段也不能改变,但baz是变量,只是引用了一个常量,所以baz是可以改变的
baz[0] = 2;
// success
baz = [2, 3];

2 类型

2.1 record

record是一组不可变的值的集合,类似于数组,但record中的值可以是不同类型,并且record中的值是不可改变的

2.1.1 声明

record支持按位置声明及命名值声明

// 按位置声明
(int, String) record = (1, '2');
// 命名声明
({int x, int y}) foo = (x: 1, y: 2)
2.1.2 取值

record支持按位置取值和按字段名取值,用法与js的数组及对象类似,但record的索引是从1开始

var record = ('first', a: 2, b: true, 'last');

print(record.$1); // Prints 'first'
print(record.a); // Prints 2
print(record.b); // Prints true
print(record.$2); // Prints 'last'
2.1.3 比较

record的比较是取每个位置的值或字段的值进行比较,只要完全一致则两个record相等

var foo = (1, 2);
var bar = (1, 2);

print(foo == bar); // true

bar = (1, 3);

print(foo == bar); // false
2.1.4 解构

record支持类似于js的解构

var (x, y) = (1, 2);

// 命名结构
var (:a, :b) = (a: 1, b: 2);