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:
<code class="language-dart hljs java has-numbering"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:html'</span>;</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>不過只導入包的某個組件的方式比較特殊:
<code class="language-dart hljs java has-numbering"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:math'</span> show Random; <span class="hljs-keyword">import</span> <span class="hljs-string">'dart:convert'</span> show JSON; <span class="hljs-keyword">import</span> <span class="hljs-string">'dart:async'</span> show Future;</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>變量
Dart 與 Python 一樣是一個強類型語言,定義變量可以不用寫明類型。但是 Dart 同時也支持寫明變量類型。
<code class="language-dart hljs mathematica has-numbering">static final <span class="hljs-keyword">Random</span> indexGen = new <span class="hljs-keyword">Random</span>(); <span class="hljs-keyword">String</span> _firstName; <span class="hljs-keyword">String</span> _appellation;</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>Dart 沒有 private 關鍵字,如果變量或方法是私有類型,需要在名稱前面加上下劃線。
私有變量
<code class="language-dart hljs ruby has-numbering"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PirateName</span> {</span><span class="hljs-comment"># ...</span><span class="hljs-constant">String</span> _firstName;<span class="hljs-constant">String</span> _appellation;<span class="hljs-comment"># ...</span> }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>私有方法
<code class="language-Dart hljs javascript has-numbering">static _parsePirateNamesFromJSON(<span class="hljs-built_in">String</span> jsonString) {Map pirateNames = <span class="hljs-built_in">JSON</span>.decode(jsonString);names = pirateNames[<span class="hljs-string">'names'</span>];appellations = pirateNames[<span class="hljs-string">'appellations'</span>]; }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>類型轉換
Dart 用關鍵字 as 來做類型轉換。
<code class="language-Dart hljs cs has-numbering"><span class="hljs-keyword">void</span> updateBadge(Event e) {String inputName = (e.target <span class="hljs-keyword">as</span> InputElement).<span class="hljs-keyword">value</span>; }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>方法
對于某些特定方法,Dart 提供了語法糖,寫法很簡單。例如,表達式的值即為返回值的情況,可以這么寫:
<code class="language-dart hljs coffeescript has-numbering">String toString<span class="hljs-function"><span class="hljs-params">()</span> =></span> pirateName;</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>不用寫成這樣:
<code class="language-dart hljs javascript has-numbering"><span class="hljs-built_in">String</span> toString() {<span class="hljs-keyword">return</span> pirateName; }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>如果是 get 方法,可以直接在返回值類型和方法名之間加上一個關鍵詞 get,而且方法名不需要加括號,調用的時候也不需要加括號。
<code class="language-Dart hljs javascript has-numbering"><span class="hljs-built_in">String</span> get jsonString => <span class="hljs-built_in">JSON</span>.encode({<span class="hljs-string">"f"</span>: _firstName, <span class="hljs-string">"a"</span>: _appellation});<span class="hljs-built_in">String</span> get pirateName =>_firstName.isEmpty ? <span class="hljs-string">''</span> : <span class="hljs-string">'$_firstName the $_appellation'</span>;</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>級聯操作符(..)
級聯操作符(The cascade operator (..))可以允許在一個成員變量上執行多個操作。
<code class="language-Dart hljs vbnet has-numbering">genButton..disabled = <span class="hljs-literal">false</span>..<span class="hljs-keyword">text</span> = <span class="hljs-comment">'Aye! Gimme a name!';</span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>以上語句就等價于
<code class="language-Dart hljs vbnet has-numbering">genButton.disabled = <span class="hljs-literal">false</span>; genButton.<span class="hljs-keyword">text</span> = <span class="hljs-comment">'Aye! Gimme a name!';</span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>字符串轉換
Dart 中變量轉化成字符串比 Java 方便多了,跟 Python 有一拼,直接在變量名前加上$符號就可以了。
<code class="language-dart hljs parser3 has-numbering"><span class="xml">'</span><span class="hljs-variable">$_firstName</span><span class="xml"> the </span><span class="hljs-variable">$_appellation</span><span class="xml">';</span></code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>構造方法
Dart 支持有名字的構造方法,這一點比 Java 和 Python 都先進。
<code class="hljs javascript has-numbering">PirateName.fromJSON(<span class="hljs-built_in">String</span> jsonString) {Map storedName = <span class="hljs-built_in">JSON</span>.decode(jsonString);_firstName = storedName[<span class="hljs-string">'f'</span>];_appellation = storedName[<span class="hljs-string">'a'</span>]; }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>這里 PirateName.fromJSON 是一個整體,用的時候要寫全了。
<code class="hljs cs has-numbering"><span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> PirateName.fromJSON(storedName);</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>參數
跟 Python 一樣,Dart 也支持 Optional and Named Arguments,例如參數可以這么寫:
<code class="hljs cmake has-numbering">PirateName({<span class="hljs-keyword">String</span> firstName, <span class="hljs-keyword">String</span> appellation}) {<span class="hljs-comment"># ...</span> }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>參數要用一個大括號括起來,應該是需要把參數封裝成一個類似于 Python 的 Dictionary。
但是調用的時候不需要傳遞所有的參數。
<code class="hljs cs has-numbering"><span class="hljs-keyword">new</span> PirateName(firstName: inputName)</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>泛型
Dart 支持泛型,這點跟 Java 很像,例如要定義一個 List 變量可以寫成這樣:
<code class="hljs php has-numbering"><span class="hljs-keyword">static</span> <span class="hljs-keyword">List</span> names = []; <span class="hljs-keyword">static</span> <span class="hljs-keyword">List</span> appellations = [];</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>如果要寫明類型,就需要在 List 后的簡括后內加上類型。
<code class="hljs mathematica has-numbering">static <span class="hljs-keyword">List</span><<span class="hljs-keyword">String</span>> names = []; static <span class="hljs-keyword">List</span><<span class="hljs-keyword">String</span>> appellations = [];</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>關于泛型類型是否像 java 那樣支持 super、 extend還沒看到,暫時不知道。
異步操作
Dart 語言原生支持異步操作,主要是用兩個關鍵詞 await 和 async。
例如,如果我們要定義一個異步方法,不需要像 java 那樣去 new Thread,直接在方法后面加上 async 關鍵字就OK了,這樣調用時,該方法時會直接返回一個 Future,caller 無需等待。
await 跟 java中的 wait 方法用法一樣,表示等待,但是它只能用于 async 的方法中。
例如上面代碼片段中, await HttpRequest.getString(path) 就表示必須要等到 HttpRequest.getString(path) 返回的 Future 有了最終結果才會繼續往下執行 _parsePirateNamesFromJSON(jsonString);。
不知道 Dart 支不支持一些高大上的語言特性,比如 閉包(Closure)、Lambda表達式(Lambda expression)、生成器(Generator)等,期待后續的學習。
總結
以上是生活随笔為你收集整理的Dart是一个怎样的语言?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android最佳性能实践(二)——分析
- 下一篇: UVA 11292 The Dragon