函数是一等公民
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;
}
调用
此时 x 的值默认就是 10.
再调用
isBiggerThanX(number:5, x:9)
此时 x 的值就是 9.
再调用
此时 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');
}