函数参数
位置参数
上一节中的示例函数,只使用了位置参数,这些参数在参数列表中的顺序至关重要。
// ex251.dart
void main(List<String> args) {
print(power(2, 5)); // 2 Output: 32
print(power(5, 2)); // 3 Output: 25
}
int power(int base, int exponent) { // 1
int result = 1;
for (int i = 0; i < exponent; i++) {
result *= base;
}
return result;
}
- 创建函数
power, 返回base的exponent次方; - 打印 2 的 5 次方(32);
- 打印 5 的 2 次方(25)。
可见在调用power函数时,必须注意参数的顺序。
命名参数
命名参数,顾名思义,就是有名字的参数。下面使用命名参数来创建power函数:
// ex252.dart
void main() {
print(power(base: 2, exponent: 5)); // 2 Output: 32
print(power(exponent: 2, base: 5)); // 3 Output: 25
}
power({required int base, required int exponent}) { // 1
// ... (omited for brevity)
}
语法方面,
- 命名参数被一对花括号(
{})包围; required关键字,表示函数的调用方必须传递该参数;- 调用函数时,采用
参数名:参数值的形式(如base: 2),给命名参数传值 。
可选参数
对于命名参数,无required修饰时,表示是可选的。
无论是位置参数还是命名参数:
- 对
nullable(可空)参数,可选参数的默认值是null; - 对
non-nullable(不可空)参数,必须指定一个默认值,才能成为可选参数; - 在参数名后使用
=来指定默认值。
// ex253.dart
void main() {
print(increase(5)); // Output: 6
print(increase(5, increment: 2)); // Output: 7
print(descrease(5)); // Output: 4
print(descrease(5, 2)); // Output: 3
}
int increase(int value, {int increment = 1}) => value + increment;
int descrease(int value, [int? decrement]) => value - (decrement ?? 1);
可选的位置参数(可以是多个),必须放在参数列表的最后,放在一对中括号里([ ])。
混合使用位置参数与命名参数
位置参数和命名参数可以混合使用,如上例中的int increase(int value, {int increment = 1}),但混合使用时:
- 位置参数必须在参数列表的开头(即先定义位置参数);
- 此时不能定义可选的位置参数。