函数是一等公民

Dart 是一门完备的面向对象的编程语言,所以函数也是对象并且其类型是 Function。所以这就表示函数也可以赋值给变量,也就是说可以将函数作为参数进行传递。

一个函数的示例

    bool isBiggerThan10(int number) {
        return number > 10;
     }

虽然加上函数的返回值是个好习惯,但是 Dart 并不一定非要返回值,因为 Dart 会尝试推断函数的返回值。如果没有明确返回值,则会返回 null(因为 Dart 中所有未定义的变量都是 null)。

例如:

    isBiggerThan10(int number) {
        return number > 10;
     }

可以通过

    print(isBiggerThan10.runtimeType);

来获取此函数的类型。

箭头函数

当然了,为了简化函数的写法,Dart 也支持箭头函数,上面的例子可以写作为:

    bool isBiggerThan10(int number) => number > 10;

但不可写作下面这样子(number > 10 后面没有分号)。

    isBiggerThan10(int number) => {
        number > 10
     };

这段代码相当于:

    isBiggerThan10(int number) {
        return {number > 10};
     };

即:函数只包含一个表达式(重点),可以简写成胖箭头形式,=> 后面的表达式将作为函数的返回结果(或者返回 null)。

参数

和其他语言一样,函数定义的时候都可以指定参数列表

    bool isBiggerThanX(int number, int x) {
        return number > x;
     }

但是如果参数很多的话,就很有可能分不清楚要传入的参数对应的是那个了。Dart 有了具名参数。

具名参数
    bool isBiggerThanX({int number, int x}) {
        return number > x;
     }

调用

    isBiggerThanX(number:5, x:9);

还可以有默认(可选)参数

    bool isBiggerThanX({int number, int x = 10}) {
        if(number == null ){
            return false;
        }
        return number > x;
     }

调用

    isBiggerThanX(number:5)

此时 x 的值默认就是 10.

再调用

    isBiggerThanX(number:5, x:9)

此时 x 的值就是 9.

再调用

isBiggerThanX()

此时 x 的值就是 10, 所以说具名参数都是可选的。但是可以通过增加 @required 来表明是必填项, 但是好像编译时并没有出错(?)。

    bool isBiggerThanX({@required int number, int x = 10}) {
        return number > x;
     }
可选参数

那有时候我想要的可选参数是可传可不传的,而参数比较少,不想使用具名的默认参数,怎么办呢?那就是用可选参数。

    bool isBiggerThanX(int number, [int x]) {
        if(x != null) {
            return number > x;
        }
        return true;
     }

当然也可以这样

    bool isBiggerThanX(int number, [int x = 9]) {
        return true;
     }

这个时候,x 不传的话就是 9 了。

但是可选参数必须放在最后一个。对于具名的默认参数,可以不放到最后一个,任意都可以设置默认参数。

匿名函数

上面的函数都起了名字,Dart 当然支持不起名字的函数

    List list = [1, 2, 3];
    list.forEach((item) {
        print('item is : $item');
     }