Dart是一個怎樣的語言?,Dart是語言?
這幾天看到一篇新聞 - 白相容了?Google 正在為 Android 準備一個去 Java 化的 Dart 應用運行架構,對與新聞的標題和內容無力吐槽,不做評論。但是Google推出 sky 似乎證明了native的開發方式越來越向web方式靠近的趨勢,最近比較火的要數 react-native 了,他們的原理是類似的,都是先構造一個 virtual dom tree,然後只更新發生變化的 dom。sky 的 readme 也說自己參考了 react,那兩者最大的區別應該是開發語言了,react-native 是 javascript,而 Google 用的是自己的親兒子 - Dart。
Node.js 推出後統一了前後端,如今 node 開發真可謂炙手可熱。Google 當初推出 Dart 也是為了統一前後端開發,但是這兩年一直不溫不火,好像國內使用 Polymer 的開發人員也不多,現在用 突然宣布說用 Dart 替換 Android 的開發語言 java,而且還舉辦了第一個第一屆 Dart Developer Summit,看來 Google 準備在 Dart 上發力了,相信 Dart 會是五月底 Google IO 大會上的一個重要議題。
趁著今天放假,跟著 Dart 官網的教程玩了一下 Dart,發現 Dart 這門語言確實不錯。
引用包
包的引用方式與 Python 和 Go 類似,都是用 import:
import 'dart:html';
不過只匯入包的某個組件的方式比較特殊:
import 'dart:math' show Random;import 'dart:convert' show JSON;import 'dart:async' show Future;
變數
Dart 與 Python 一樣是一個強型別語言,定義變數可以不用寫明類型。但是 Dart 同時也支援寫明變數類型。
static final Random indexGen = new Random();String _firstName;String _appellation;
Dart 沒有 private 關鍵字,如果變數或方法是私人類型,需要在名稱前面加上底線。
私人變數
class PirateName { # ... String _firstName; String _appellation; # ...}
私人方法
static _parsePirateNamesFromJSON(String jsonString) { Map pirateNames = JSON.decode(jsonString); names = pirateNames['names']; appellations = pirateNames['appellations'];}
類型轉換
Dart 用關鍵字 as 來做類型轉換。
void updateBadge(Event e) { String inputName = (e.target as InputElement).value;}
方法
對於某些特定方法,Dart 提供了文法糖,寫法很簡單。例如,運算式的值即為傳回值的情況,可以這麼寫:
String toString() => pirateName;
不用寫成這樣:
String toString() { return pirateName;}
如果是 get 方法,可以直接在傳回值類型和方法名之間加上一個關鍵詞 get,而且方法名不需要加括弧,調用的時候也不需要加括弧。
String get jsonString => JSON.encode({"f": _firstName, "a": _appellation});String get pirateName => _firstName.isEmpty ? '' : '$_firstName the $_appellation';
級聯操作符(..)
級聯操作符(The cascade operator (..))可以允許在一個成員變數上執行多個操作。
genButton..disabled = false ..text = 'Aye! Gimme a name!';
以上語句就等價於
genButton.disabled = false;genButton.text = 'Aye! Gimme a name!';
字串轉換
Dart 中變數轉化成字串比 Java 方便多了,跟 Python 有一拼,直接在變數名前加上$符號就可以了。
'$_firstName the $_appellation';
構造方法
Dart 支援有名字的構造方法,這一點比 Java 和 Python 都先進。
PirateName.fromJSON(String jsonString) { Map storedName = JSON.decode(jsonString); _firstName = storedName['f']; _appellation = storedName['a'];}
這裡 PirateName.fromJSON 是一個整體,用的時候要寫全了。
return new PirateName.fromJSON(storedName);
參數
跟 Python 一樣,Dart 也支援 Optional and Named Arguments,例如參數可以這麼寫:
PirateName({String firstName, String appellation}) { # ...}
參數要用一個大括弧括起來,應該是需要把參數封裝成一個類似於 Python 的 Dictionary。
但是調用的時候不需要傳遞所有的參數。
new PirateName(firstName: inputName)
泛型
Dart 支援泛型,這點跟 Java 很像,例如要定義一個 List 變數可以寫成這樣:
static List names = [];static List appellations = [];
如果要寫明類型,就需要在 List 後的簡括後內加上類型。
static List<String> names = [];static List<String> appellations = [];
關於泛型型別是否像 java 那樣支援 super、 extend還沒看到,暫時不知道。
非同步作業
Dart 語言原生支援非同步作業,主要是用兩個關鍵詞 await 和 async。
例如,如果我們要定義一個非同步方法呼叫,不需要像 java 那樣去 new Thread,直接在方法後面加上 async 關鍵字就OK了,這樣調用時,該方法時會直接返回一個 Future,caller 無需等待。
static Future readyThePirates() async { String path = 'piratenames.json'; String jsonString = await HttpRequest.getString(path); _parsePirateNamesFromJSON(jsonString); }
await 跟 java中的 wait 方法用法一樣,表示等待,但是它只能用於 async 的方法中。
例如上面程式碼片段中, await HttpRequest.getString(path) 就表示必須要等到 HttpRequest.getString(path) 返回的 Future 有了最終結果才會繼續往下執行 _parsePirateNamesFromJSON(jsonString);。
不知道 Dart 支不支援一些高大上的語言特性,比如 閉包(Closure)、Lambda運算式(Lambda expression)、產生器(Generator)等,期待後續的學習。