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。