這幾天看到一篇新聞 - 白兼容了,?Google 正在為 Android 準備一個去 Java 化的 Dart 應用運行框架,,對與新聞的標題和內(nèi)容無力吐槽,不做評論,。但是Google推出 sky 似乎證明了native的開發(fā)方式越來越向web方式靠近的趨勢,,最近比較火的要數(shù) react-native 了,,他們的原理是類似的,,都是先構(gòu)造一個 virtual dom tree,,然后只更新發(fā)生變化的 dom,。sky 的 readme 也說自己參考了 react,,那兩者最大的區(qū)別應該是開發(fā)語言了,,react-native 是 javascript,,而 Google 用的是自己的親兒子 - Dart,。
Node.js 推出后統(tǒng)一了前后端,,如今 node 開發(fā)真可謂炙手可熱,。Google 當初推出 Dart 也是為了統(tǒng)一前后端開發(fā),,但是這兩年一直不溫不火,好像國內(nèi)使用 Polymer 的開發(fā)者也不多,,現(xiàn)在用 突然宣布說用 Dart 替換 Android 的開發(fā)語言 java,,而且還舉辦了第一個第一屆 Dart Developer Summit,,看來 Google 準備在 Dart 上發(fā)力了,相信 Dart 會是五月底 Google IO 大會上的一個重要議題,。
趁著今天放假,,跟著 Dart 官網(wǎng)的教程玩了一下 Dart,發(fā)現(xiàn) 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'];
}
類型轉(zhuǎn)換
Dart 用關鍵字 as 來做類型轉(zhuǎn)換,。
void updateBadge(Event e) {
String inputName = (e.target as InputElement).value;
}
方法
對于某些特定方法,Dart 提供了語法糖,,寫法很簡單,。例如,,表達式的值即為返回值的情況,,可以這么寫:
String toString() => pirateName;
不用寫成這樣:
String toString() {
return pirateName;
}
如果是 get 方法,,可以直接在返回值類型和方法名之間加上一個關鍵詞 get ,,而且方法名不需要加括號,,調(diào)用的時候也不需要加括號,。
String get jsonString => JSON.encode({"f": _firstName, "a": _appellation});
String get pirateName =>
_firstName.isEmpty ? '' : '$_firstName the $_appellation';
級聯(lián)操作符(..)
級聯(lián)操作符(The cascade operator (..))可以允許在一個成員變量上執(zhí)行多個操作,。
genButton..disabled = false
..text = 'Aye! Gimme a name!';
以上語句就等價于
genButton.disabled = false;
genButton.text = 'Aye! Gimme a name!';
字符串轉(zhuǎn)換
Dart 中變量轉(zhuǎn)化成字符串比 Java 方便多了,,跟 Python 有一拼,,直接在變量名前加上$符號就可以了,。
'$_firstName the $_appellation';
構(gòu)造方法
Dart 支持有名字的構(gòu)造方法,,這一點比 Java 和 Python 都先進,。
PirateName.fromJSON(String jsonString) {
Map storedName = JSON.decode(jsonString);
_firstName = storedName['f'];
_appellation = storedName['a'];
}
這里 PirateName.fromJSON 是一個整體,,用的時候要寫全了,。
return new PirateName.fromJSON(storedName);
參數(shù)
跟 Python 一樣,Dart 也支持 Optional and Named Arguments,例如參數(shù)可以這么寫:
PirateName({String firstName, String appellation}) {
# ...
}
參數(shù)要用一個大括號括起來,,應該是需要把參數(shù)封裝成一個類似于 Python 的 Dictionary ,。
但是調(diào)用的時候不需要傳遞所有的參數(shù),。
new PirateName(firstName: inputName)
泛型
Dart 支持泛型,,這點跟 Java 很像,例如要定義一個 List 變量可以寫成這樣:
static List names = [];
static List appellations = [];
如果要寫明類型,,就需要在 List 后的簡括后內(nèi)加上類型,。
static List<String> names = [];
static List<String> appellations = [];
關于泛型類型是否像 java 那樣支持 super 、 extend 還沒看到,,暫時不知道。
異步操作
Dart 語言原生支持異步操作,,主要是用兩個關鍵詞 await 和 async ,。
例如,如果我們要定義一個異步方法,,不需要像 java 那樣去 new Thread,,直接在方法后面加上 async 關鍵字就OK了,這樣調(diào)用時,,該方法時會直接返回一個 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 有了最終結(jié)果才會繼續(xù)往下執(zhí)行 _parsePirateNamesFromJSON(jsonString); ,。
不知道 Dart 支不支持一些高大上的語言特性,,比如 閉包(Closure)、Lambda表達式(Lambda expression),、生成器(Generator)等,,期待后續(xù)的學習。
|