Dart 3 在 2023/05/10 正式發佈,既然升了主版號,肯定有很多語法上的更動,大致整理成以下三點:

1. Null Safety - 空值安全

final a = int.tryParse('not a int');
print(a?.toString() ?? 'NaN')

其實在 Dart 2.12 就有了,但因為 Dart 2 會有向下不相容的問題,所以要等到主版號升了才能做 breaking changes,要求所有 Dart 3 程式碼都要支援 Null Safety

2. Records & Pattern Declaration - 多值封裝與解構

與 Kotlin 差不多,都是自動封裝與解構的語法糖

fun arr() = Array(0, 1, 2)
val (a, b, c) = arr()

但 Kotlin 用 component1()component5() 的方式實作解構不方便擴充

fun arr() = Array(0, 1, 2, 3, 4, 5)
val (a, b, c, d, e, f) = arr() // ERROR

Dart 在函數宣告多個返回值,傳遞時會自動封裝成類似匿名物件,不會有回傳數量上限問題
不想接收某個回傳值可以用 _ 底線接收來省略

(double x, double y) geoLocation() {
  return (-1.23, 4.56);
}

void main(List<String> arguments) {
  final (x2, y2) = geoLocation();
  print('x2 = $x2, y2 = $y2');

  final (_, y3) = geoLocation();
  print('y3 = $y3');
}

3. Class Modifiers - 明確定義類別用途

  • class (沒有修飾子): 可以被實作與繼承
  • base class: 不能 被實作
  • interface class: 不能 被繼承
  • final class: 不能 被繼承或實作
  • base mixin: mixin 不能 被實作,而且引入 mixin 的類別 不能 被實作
  • final mixin: mixin 不能 被實作,而且引入 mixin 的類別 不能 被實作或繼承
  • mixin class: 混亂邪惡,同時是 mixin 也是 class

詳細資訊可以看 Dart Class Modifiers Specification

心得

Class Modifiers 感覺是承認把物件導向統合成 class 是一種錯誤,但同時又推出比 class 更毒瘤的 mixin class,三個願望一次滿足,各位 Dart 使用者又能寫出更多酷酷的 ninja code。