Dart 2.7 發布了,此版本添加了對擴展方法的支持,並帶來一個用於處理帶有特殊字元的字元串的新程序包。DartPad 中 null 的安全性也得到了更新。
Dart 2.7 添加了一個強大的語言新功能:擴展方法(extension methods)。它使你可以向任何類型(甚至是無法控制的類型)添加新功能,並具有常規方法調用的簡潔性和自動完成性。
讓我們看一個小例子:增加對從字元串解析整數和雙精度的支持。作為應用開發人員,我們無法更改 String 類,因為它是在 dart:core 庫中定義的,但是通過擴展方法,我們可以對其進行擴展。定義此擴展名后,我們可以在 String 上調用新的 parseInt 方法,就好像該方法是在 String 類本身上定義的一樣:
extension ParseNumbers on String {
int parseInt() {
return int.parse(this);
} double parseDouble() {
return double.parse(this);
}
}main() {
int i = '42'.parseInt();
print(i);
}
關於擴展方法的內容太多,此處不做詳述,詳情參見更新說明。
Dart 的標準 String 類使用 UTF-16 編碼。這是編程語言中的常見選擇,尤其是那些支持在設備和 Web 上本機運行的語言。
UTF-16 字元串通常可以很好地工作。但是,在處理字元串時,尤其是在處理用戶輸入的字元串時,可能會遇到用戶理解為字元的字元與 UTF-16 中編碼為代碼單元的字元之間的差異。讓我們看一個小例子,提取用戶輸入的字元串的前三個字元:
var input = [『Resume』];
input.forEach((s) => print(s.substring(0, 3)));$ dart main.dart
Res
到目前為止沒有問題;我們在輸入列表中列印了字元串的前三個字元,結果為 Res。現在,我們考慮來自不同地區的用戶,他們可能會輸入包含重音符號,韓語(韓語腳本)甚至是表情符號組合的字元串來代表「恢復」概念:
對於 Re′sumé,為什麼我們得到一個「兩個字元」的字元串?對於那兩個 emoji,奇怪的問號是怎麼回事?這裡的問題出在 Unicode。實際上,Résume 中的重音符號 e 是兩個代碼點:e 和組合的重音符號。
就像之前說過的,通常不需要擔心字元和代碼點。如果你要做的只是接收、傳遞並移交整個字元串,則內部編碼是清晰可見的。但是,如果需要遍歷字元串的字元或操縱字元串的內容,就可能會遇到麻煩。
Dart 2.7 引入了一個新的字元包,用於處理這些情況。此程序包支持將字元串視為用戶感知的字元序列,也稱為 Unicode 字形簇。使用字元包,可以通過對縮短文本的代碼進行少量更改來修復代碼:
// Before:
input.forEach((s) => print(s.substring(0, 3)));// After, using the characters package:
input.forEach((s) => print(s.characters.take(3)));
首先,我們從 s 中的字元串創建一個新的 Characters 實例(使用方便的 .characters 擴展方法)。然後使用 take() 方法提取前三個字元即可。
新版本還帶來了 Null 安全性預覽。
更多詳細信息,參見:
[admin
]