Dart語法快速上手一《Dart2隨筆之前言及概覽》


隨著Google爸爸近兩年推出了Flutter,Dart語言感覺一下子就火了起來,F(xiàn)lutter作為一個(gè)“次時(shí)代”的移動(dòng)端跨平臺(tái)解決方案,Google一直不遺余力的推廣,特別是在今年上海舉行的GDD2018上面,Google花了大篇幅的會(huì)場(chǎng)時(shí)間來介紹Flutter,F(xiàn)lutter代替RN成為新一代跨平臺(tái)王者感覺是大勢(shì)所趨,趁著潮流來襲之前,趕緊趟一趟這片藍(lán)海,避免以后在不斷發(fā)展的技術(shù)潮流中被淘汰,時(shí)刻保持學(xué)習(xí)這也是一個(gè)合格的程序員必備的素質(zhì),在寫這篇博客之前,本人花了一些時(shí)間并且購(gòu)買了一本名為《Dart編程語言》的譯本,這本書是基于Dart1進(jìn)行講解的,后來其實(shí)發(fā)現(xiàn)Google在2月份已經(jīng)發(fā)布了Dart2.1,有些語法已經(jīng)不一樣了,所以還是拋棄了那本書,鑒于目前國(guó)內(nèi)以及國(guó)外沒有任何可以參考的Dart2書籍,所以本人就直接從官網(wǎng)查看Dart2的DevGuide,從中整合了一些零散的知識(shí)進(jìn)行一些拼湊和個(gè)人的理解,由于水平有限加上也在自己也在學(xué)習(xí)Dart,文中可能會(huì)出現(xiàn)一些理解錯(cuò)誤,還希望各位批評(píng)指正

概覽


tips:本文適合已經(jīng)掌握了其他編程語言基礎(chǔ)的程序員觀看,并不適合新手,有些基礎(chǔ)概念以及與java相仿的特性可能會(huì)直接略過,敬請(qǐng)諒解

  • 一個(gè)基本的Dart程序概覽(摘自官網(wǎng)并稍微改造了一下)
class LearningDart2{
// 定義一個(gè)方法
printInteger(int aNumber) {
  print('The number is $aNumber.'); // 通用打印方法.
  return aNumber < 10 ? 0 : 1;
}

// main方法,跟java一樣,是整個(gè)程序的入口
main() {
  var number = 42; // 聲明變量
  var returnValue = printInteger(number); // 調(diào)用方法
  print("the return value is $returnValue");
  
  print("the printString Value is "+printString());

  for (int i = 0; i < 4; i++) {   //for循環(huán)
    print('hello ${i}');
  }
}


printString() => "printString";//這個(gè)也是一個(gè)方法
}

從這個(gè)簡(jiǎn)單的不能再簡(jiǎn)單的dart程序里面我們能看出來什么呢?

1: dart跟java一樣程序的入口也是main函數(shù),這是dart程序的源頭

2:dart的類定義跟java很像,幾乎是一毛一樣

3:dart也有三目運(yùn)算符

4: 定義變量不需要強(qiáng)制指定變量類型,這點(diǎn)跟Kotlin很像,但是Dart只有var沒有val的概念,val直接融入在final關(guān)鍵字里面,后面會(huì)講到

5:方法的定義中,不需要顯示指定返回類型,而是你默認(rèn)以return的數(shù)據(jù)類型作為方法的隱式返回類型,但是如果顯示指定了返回類型,返回類型不匹配則會(huì)編譯失敗,比如:

String printInteger(int aNumber) {
   print('The number is $aNumber.'); // 通用打印方法.
   return aNumber; //錯(cuò)誤,這里必須返回是一個(gè)String字符串
}

6:方法也能簡(jiǎn)寫,如果你的方法只是一個(gè)返回值,或者你的方法一行足以搞定,直接functionName() => "functionBody"加上一個(gè)=>操作符就可以了,是不是十分簡(jiǎn)單。

7:for循環(huán)跟java一毛一樣
8:差點(diǎn)忘了,分號(hào)必不可少(萬惡的分號(hào))

Dart中一些重要的概念(翻譯自官網(wǎng))

  • 萬物皆對(duì)象,所有的對(duì)象都是類的實(shí)例,包括內(nèi)置數(shù)據(jù)類型,所有的對(duì)象都繼承自O(shè)bject
  • 盡管Dart是強(qiáng)類型的,但類型注釋是可選的,因?yàn)镈art可以推斷類型。
    在上面的代碼中,number可被推斷為int類
  • Dart支持泛型,類似于List<int>或者List<自定義對(duì)象>都是支持的
  • Dart支持頂級(jí)函數(shù)(例如main()),以及綁定到類或?qū)ο蟮暮瘮?shù)(分別是靜態(tài)和實(shí)例方法)。您還可以在函數(shù)內(nèi)創(chuàng)建函數(shù)(嵌套函數(shù)或本地函數(shù))
  • 類似地,Dart支持頂級(jí)變量,以及綁定到類或?qū)ο蟮淖兞浚o態(tài)和實(shí)例變量)。實(shí)例變量有時(shí)稱為字段或?qū)傩?/li>
  • 與Java不同,Dart沒有關(guān)鍵字public,protected和private。如果標(biāo)識(shí)符以下劃線(_)開頭,則它對(duì)其庫(kù)是私有的,例如:
class LearningDart {
  var _x = 1;
  var  y  = 2;
}

這里很明顯,x變量相當(dāng)于java中的 private int x = 1; kotlin的private var x = 1;外部對(duì)象是不可見的

  • Dart具有兩種條件判斷表達(dá)式三目運(yùn)算符(可以返回值)以及if else(不具有),什么意思呢?舉個(gè)例子:
 var a = if(2 == 0) 1 else 2; //這個(gè)語法在Kotlin中有效,在Dart中是非法的
 print("$a");

上面這個(gè)條件判斷語句不會(huì)將2賦值給a,如果要賦值的話,需要改成

var a = (2 == 0)? 1:2; //合法
print("$a");
  • Dart關(guān)鍵字


    image.png

    image.png
  • 避免使用這些單詞作為標(biāo)識(shí)符。但是,如有必要,標(biāo)有上標(biāo)的關(guān)鍵字可以是標(biāo)識(shí)符:帶有上標(biāo)1的單詞是上下文關(guān)鍵字,僅在特定位置具有含義。他們到處都是有效的標(biāo)識(shí)符。帶有上標(biāo)2的單詞是內(nèi)置標(biāo)識(shí)符。
    為了簡(jiǎn)化將JavaScript代碼移植到Dart的任務(wù),這些關(guān)鍵字在大多數(shù)地方都是有效的標(biāo)識(shí)符,但它們不能用作類或類型名稱,也不能用作導(dǎo)入前綴。
    帶有上標(biāo)3的單詞是與Dart 1.0發(fā)布后添加的異步支持相關(guān)的更新,有限的保留字。您不能在標(biāo)記為async,async *或sync *的任何函數(shù)體中使用await或yield作為標(biāo)識(shí)符。表中的所有其他單詞都是保留字,不能是標(biāo)識(shí)符。

Dart2學(xué)習(xí)筆記的概覽就先放送到這里,因?yàn)槭歉庞[所以并沒有結(jié)構(gòu)性的去講解具體的知識(shí),只是讓大家和我初步認(rèn)識(shí)到dart的語法大概是個(gè)什么樣子的,后面的內(nèi)容根據(jù)工作繁忙的程度不定時(shí)積極更新~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容