Dart是一個怎樣的語言?
轉載自 碼農的自留地 http://blog.csdn.net/feelang/article/details/45469151
這幾天看到一篇新聞 - 白兼容了?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)等,期待后續的學習。