Dart tour: 6、操作符

235 阅读2分钟

本篇仅介绍些独特的操作符,常规的可以查操作符文档

类型判断运算符

  • as: 类型转换(也用作指定类前缀))
  • is: 如果对象是指定类型则返回 true
  • is!: 如果对象是指定类型则返回 false

当且仅当 obj 实现了 T 的接口,obj is T 才是 true。例如 obj is Object 总为 true,因为所有类都是 Object 的子类。

// 仅当确定这个对象是该类型的时候,才可以使用 as 操作符可以把对象转换为特定的类型
(employee as Person).firstName = 'Bob';

// 如果不确定这个对象类型是不是 T,请在转型前使用 is T 检查类型
if (employee is Person) {
  // Type check
  employee.firstName = 'Bob';
}

// 上述两种方式是有区别的:如果 employee 为 null 或者不为 Person 类型,则第一种方式将会抛出异常,而第二种不会。

赋值运算符

  • ??=: 仅当被赋值的变量为 null 时,才可以成功赋值。
void main() {
  var b = null;
  var value = 21;

  // Assign value to b if b is null; otherwise, b stays the same
  b ??= value;
  print(b);
}

条件运算符

  • condition ? expr1 : expr2: 三元表达式
  • expr1 ?? expr2: 如果表达式 1 为非 null 则返回其值,否则执行表达式 2 并返回其值。
var isPublic = true;
var visibility = isPublic ? 'public' : 'private';
assert(visibility == 'public');


级联运算符

?.. 语法是在 Dart 2.12 中引入的。

级联运算符 (.., ?..) 可以在同一个对象上连续调用多个对象的变量或方法。

// 这部分的代码无法直接运行,仅做展示语法用途。
// 在同一个对象上连续调用多个对象的变量或方法
var paint = Paint()
  ..color = Colors.black
  ..strokeCap = StrokeCap.round
  ..strokeWidth = 5.0;

// 等价于
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;

// 如果操作级联运算符的对象可能为空(null), 就在开始使用 `?..` 来操作,这样保证不会在空对象上操作。
querySelector('#confirm') // Get an object.
  ?..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

// 级联操作符可以嵌套使用
final addressBook = (AddressBookBuilder()
  ..name = 'jenny'
  ..email = 'jenny@example.com'
  ..phone = (PhoneNumberBuilder()
        ..number = '415-555-0100'
        ..label = 'home')
      .build())
.build();

访问成员

  • .: 访问成员。
  • ?.: 条件访问成员, 与上述成员访问符类似,但是左边的操作对象不能为 null,例如 foo?.bar,如果 foonull 则返回 null ,否则返回 bar