dart系列之:dart語言中的函數


簡介

函數是所有編程語言都有的內容,不管是面向對象還是面向過程,函數都是非常重要的一部分。dart中的函數和java中的函數有什么區別呢?

dart作為一種面向對象的編程語言,它的函數也是一個對象,用Function來表示。先看下函數的定義:

abstract class Function {
  
  external static apply(Function function, List<dynamic>? positionalArguments,
      [Map<Symbol, dynamic>? namedArguments]);

  int get hashCode;

  bool operator ==(Object other);
}

既然函數是一個對象,那么可以將函數賦值給對象,還可以將函數當做參數傳遞給其他的函數。

下面是一個簡單的函數,由返回值,函數名稱,參數和函數體來表示:

bool isStudent(int age){
    return age < 20;
    }

盡管dart建議我們指定函數的返回值類型,但是你也可以忽略返回值:

isStudent(int age){
    return age < 20;
    }

函數還有一個簡寫方式,如果函數體只有一條語句,那么可以使用=> 來替代括號:

isStudent(int age) => age < 20;

看起來更加簡潔。

函數的參數

dart中的函數參數有普通參數,也有命名參數。

普通參數很好理解,那么什么是命名參數呢?

命名參數就是給參數傳遞的時候起了一個名字,這樣函數在調用的時候,可以指定參數的名字,來賦值。

看一個函數參數和命名參數的例子:

bool calculator(int age , {int? size}){

}

可以這樣調用:

calculator(15,size:10);

默認情況下命名參數是可選的,也就是說函數在調用的時候可以選擇是否傳遞可選的參數。

如果必須要傳遞某個參數,那么可以將其設置為required.

除了命名參數之外,dart還有可選的位置參數,就是將參數放在[]中,如下所示:

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

上面的函數在調用的時候,可以只傳入普通參數,也可以額外的傳入可選的位置參數,如下:

say('Bob', 'Howdy');
say('Bob', 'Howdy', 'smoke signal');

dart中的參數還可以設置默認值,如下:

String say(String from='mack', String msg, [String? device='ios']) {
  ...
}

main函數

dart中main函數是應用程序的啟動入口,main()是一個特殊的函數,他是沒有返回值的帶有可選List 參數的函數,如下所示:

void main() {
  print('Hello, World!');
}
void main(List<String> arguments) {
  print(arguments);
}

匿名函數

大部分函數都是帶有名字的,方便函數的調用。在某些情況下,函數也可以不帶名字,這樣的函數叫做匿名函數。

匿名函數就是沒有名字的函數,如下所示:

([[Type] param1[, …]]) {
  codeBlock;
};

匿名函數通常用在不需要被其他場景調用的情況,比如遍歷一個list:

const list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
  print('${list.indexOf(item)}: $item');
});

閉包

提到閉包,大家馬上就會想到javascript,沒錯,除了javascript,dart中也可以構建閉包。

什么是閉包呢?簡單點說就是函數的函數。也就是一個函數中定義的變量,在函數范圍外被其他的函數所使用。

Function sum(int age1){
    return (int i) => age1 +i; 
}

void main() {
  var sum2 = sum(2);
  var result = sum2(5);
}

上例子中,sum傳入的變量2,被在后續的sum2中使用。

函數的返回值

所有的函數都有返回值,如果沒有顯示返回的話,那么返回的就是null.

所以對下面的函數來說:

foo() {}

它的值是null,也就是說下面的表達式是true:

assert(foo() == null);

總結

以上,就是Dart中函數的定義了。

本文已收錄於 http://www.flydean.com/03-dart-function/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM