函数参数

函数参数有位置参数命名参数之分,另外还有可选参数

位置参数

上一节中的示例函数,只使用了位置参数,这些参数在参数列表中的顺序至关重要。

// 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;
}
  1. 创建函数power, 返回 baseexponent次方;
  2. 打印 2 的 5 次方(32);
  3. 打印 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}),但混合使用时:

  • 位置参数必须在参数列表的开头(即先定义位置参数);
  • 此时不能定义可选的位置参数。