函数参数
位置参数
上一节中的示例函数,只使用了位置参数,这些参数在参数列表中的顺序至关重要。
// ch0205_1.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
函数:
// ch0205_2.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
(不可空)参数,必须指定一个默认值,才能成为可选参数; - 在参数名后使用
=
来指定默认值。
// ch0205_3.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})
,但混合使用时:
- 位置参数必须在参数列表的开头(即先定义位置参数);
- 此时不能定义可选的位置参数。