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

flydean發表於2021-11-10

簡介

函式是所有程式語言都有的內容,不管是物件導向還是程式導向,函式都是非常重要的一部分。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<String>引數的函式,如下所示:

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/

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

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

相關文章