歡迎您光臨本站 註冊首頁

Dart 2.7 發布,新增擴展方法支持

←手機掃碼閱讀     admin @ 2019-12-13 , reply:0

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 安全性預覽。

更多詳細信息,參見:

https://medium.com/dartlang/dart-2-7-a3710ec54e97


[admin ]

來源:OsChina
連結:https://www.oschina.net/news/112035/dart-2-7-released
Dart 2.7 發布,新增擴展方法支持已經有183次圍觀

http://coctec.com/news/all/show-post-221324.html