Dart 語言簡易教程(三)

Dart 語言簡易教程(一): http://www.reibang.com/p/8a62b1a2fd75
Dart 語言簡易教程(二): http://www.reibang.com/p/b2153a32dd8b

Dart 語言簡易教程(三)

函數(shù)(Functions)

Dart 是一個面向?qū)ο蟮恼Z言碾阁,所以即使是函數(shù)也是對象腋颠,函數(shù)屬于Function對象柱徙。
可以通過函數(shù)來指定變量或者像其它的函數(shù)傳遞參數(shù)冒掌。

函數(shù)實現(xiàn)的例子:

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

可以去掉形式參數(shù)數(shù)據(jù)類型和返回值的數(shù)據(jù)類型罪帖。
下面的例子演示了這些:

isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

如果函數(shù)只有單個語句翩剪,可以采用簡略的形式:

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

The => expr; syntax is a shorthand for { return expr;}.

函數(shù)可以有兩中類型的參數(shù):

  • 必須的
    必須的參數(shù)放在參數(shù)列表的前面腕柜。
  • 可選的
    可選的參數(shù)跟在必須的參數(shù)后面膀篮。

可選的參數(shù)

可以通過名字或位置個函數(shù)指定可選參數(shù)毯焕。

可選的名字參數(shù)

在調(diào)用函數(shù)時衍腥,可以指定參數(shù)的名字及相應(yīng)的取值,采用paramName: value的格式纳猫。
例如函數(shù)定義:

/// Sets the [bold] and [hidden] flags to the values
/// you specify.
enableFlags({bool bold, bool hidden}) {
  // ...
}

函數(shù)調(diào)用:

enableFlags(bold: true, hidden: false);

可選的位置參數(shù)

將參數(shù)使用[] 括起來紧阔,用來表明是可選位置參數(shù)。
例如下面的例子续担,函數(shù)定義:

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

調(diào)用函數(shù)不包含第三個參數(shù):

assert(say('Bob', 'Howdy') == 'Bob says Howdy');

調(diào)用函數(shù)包含第三個參數(shù):

assert(say('Bob', 'Howdy', 'smoke signal') ==
    'Bob says Howdy with a smoke signal');

參數(shù)默認(rèn)值

可以定義包含默認(rèn)位置參數(shù)或默認(rèn)名字參數(shù)的函數(shù)擅耽。參數(shù)的默認(rèn)值必須是編譯時的靜態(tài)值。
假如定義函數(shù)時物遇,沒有指定默認(rèn)的參數(shù)值乖仇,則參數(shù)值默認(rèn)為null 憾儒。

  • 使用冒號(:)來設(shè)置默認(rèn)名字參數(shù)。

// Sets the [bold] and [hidden] flags to the values you
// specify, defaulting to false.
enableFlags({bool bold: false, bool hidden: false}) {
// ...
}
// bold will be true; hidden will be false.
enableFlags(bold: true);

- 使用等號(`= `)來設(shè)置默位置字參數(shù)乃沙。
```Dart
String say(String from, String msg,
    [String device = 'carrier pigeon', String mood]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  if (mood != null) {
    result = '$result (in a $mood mood)';
  }
  return result;
}
assert(say('Bob', 'Howdy') ==
    'Bob says Howdy with a carrier pigeon');

也可以將listsmaps類型作為默認(rèn)值起趾。
如下面的例子:

doStuff({List<int> list: const[1, 2, 3],
         Map<String, String> gifts: const{'first':  'paper',
                                          'second': 'cotton',
                                          'third':  'leather'}}) {
  print('list:  $list');
  print('gifts: $gifts');
}

main() {
  // Use the default values for both parameters.
  doStuff();

  // Use the default values for the "gifts" parameter.
  doStuff(list:[4,5,6]);
  
  // Don't use the default values for either parameter.
  doStuff(list: null, gifts: null);
}

對應(yīng)輸出結(jié)果是:

list:  [1, 2, 3]
gifts: {first: paper, second: cotton, third: leather}
list:  [4, 5, 6]
gifts: {first: paper, second: cotton, third: leather}
list:  null
gifts: null

main() 函數(shù)

所以的APP 都必須有一個mian()函數(shù),作為APP 的應(yīng)用接入點警儒。
main()函數(shù)返回void 類型训裆,并且包含可選的List< String > 類型的參數(shù)。

main()函數(shù)不包含參數(shù)的例子:

void main() {
  querySelector("#sample_text_id")
    ..text = "Click me!"
    ..onClick.listen(reverseText);
}

main()函數(shù)包含參數(shù)的例子:

// Run the app like this: dart args.dart 1 test
void main(List<String> arguments) {
  print(arguments);

  assert(arguments.length == 2);
  assert(int.parse(arguments[0]) == 1);
  assert(arguments[1] == 'test');
}

傳遞函數(shù)給函數(shù)

  • 可以將一個函數(shù)作為一個參數(shù)傳遞給另一個函數(shù)蜀铲。例如:

    printElement(element) {
      print(element);
    }
    
    var list = [1, 2, 3];
    
    // Pass printElement as a parameter.
    list.forEach(printElement);
    
  • 也可以將函數(shù)賦值給一個變量边琉。例如:

    var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
    assert(loudify('hello') == '!!! HELLO !!!');
    

變量作用范圍

嵌套的函數(shù)中可以訪問包含他的函數(shù)中定義的變量。例如:

var topLevel = true;

main() {
  var insideMain = true;

  myFunction() {
    var insideFunction = true;

    nestedFunction() {
      var insideNestedFunction = true;

      assert(topLevel);
      assert(insideMain);
      assert(insideFunction);
      assert(insideNestedFunction);
    }
  }
}

變量閉合

函數(shù)可以返回一個函數(shù)记劝。例如:

/// Returns a function that adds [addBy] to the
/// function's argument.
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

main() {
  // Create a function that adds 2.
  var add2 = makeAdder(2);

  // Create a function that adds 4.
  var add4 = makeAdder(4);

  assert(add2(3) == 5);
  assert(add4(3) == 7);
}

函數(shù)返回值

所以的函數(shù)都會有返回值变姨。
如果沒有指定函數(shù)返回值,則默認(rèn)的返回值是null厌丑。
沒有返回值的函數(shù)定欧,系統(tǒng)會在最后添加隱式的return 語句。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怒竿,一起剝皮案震驚了整個濱河市砍鸠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耕驰,老刑警劉巖爷辱,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耍属,居然都是意外死亡托嚣,警方通過查閱死者的電腦和手機巩检,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門厚骗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兢哭,你說我怎么就攤上這事领舰。” “怎么了迟螺?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵冲秽,是天一觀的道長。 經(jīng)常有香客問我矩父,道長锉桑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任窍株,我火速辦了婚禮民轴,結(jié)果婚禮上攻柠,老公的妹妹穿的比我還像新娘。我一直安慰自己后裸,他們只是感情好瑰钮,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著微驶,像睡著了一般浪谴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上因苹,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天苟耻,我揣著相機與錄音,去河邊找鬼容燕。 笑死梁呈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蘸秘。 我是一名探鬼主播官卡,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼醋虏!你這毒婦竟也來了寻咒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颈嚼,失蹤者是張志新(化名)和其女友劉穎毛秘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阻课,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡叫挟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了限煞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹恳。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖署驻,靈堂內(nèi)的尸體忽然破棺而出奋献,到底是詐尸還是另有隱情,我是刑警寧澤旺上,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布瓶蚂,位于F島的核電站,受9級特大地震影響宣吱,放射性物質(zhì)發(fā)生泄漏窃这。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一征候、第九天 我趴在偏房一處隱蔽的房頂上張望杭攻。 院中可真熱鬧洒试,春花似錦、人聲如沸朴上。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痪宰。三九已至叼架,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衣撬,已是汗流浹背乖订。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留具练,地道東北人乍构。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像扛点,于是被迫代替她去往敵國和親哥遮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容