如何为功能类型的可选位置参数设置默认值?

Atomycon

我正在将函数作为可选参数传递给构造函数,但无法分配默认值。

void main() {
  Person p = Person();
  print(p.foo('Hello'));
}

class Person {
  final String Function(String) foo;
  Person({this.foo});
}

现在尝试分配一个默认值:Person({this.foo = (val) {return val;});产生错误:Error: Not a constant expression.我知道该参数必须是,const但是使用const甚至staticinfront(val) {return val;}都不起作用。

有谁知道如何解决这个问题?

rn

您只能将常量值(也称为编译时常量)用作默认值。您无法创建常量函数文字,因此无法在构造函数中内联编写函数。

但是,对顶级或静态函数的引用是常量,因此您可以将默认值函数声明为静态函数或顶级函数。

void main() {
  Person p = Person();
  print(p.foo('Hello')); // Prints "Hello"
}

class Person {
  final String Function(String) foo;
  Person({this.foo = _identity});
  static String _identity(String value) => value;
}
// or as top-level.
// String _identity(String value) => value;

如果默认值在实例方法上,并且可以期望任何人扩展或实现您的类,则可以(并且应该)选择将函数公开在这种情况下,他们需要声明相同的默认值。

通常至少同样有用的另一种选择是不使用默认值,而是null在使用值之前替换a

class Person {
  final String Function(String) foo;
  Person({String Function(String) foo}) : foo = foo ?? _identity;
  static String _identity(String value) => value;
}

甚至使用非恒定值:

class Person {
  final String Function(String) foo;
  Person({String Function(String) foo}) : foo = (foo ?? (String x) => x);
}

对于构造函数,它几乎没有什么区别。如果是实例方法,则使用??replacenull避免子类必须使用与默认值完全相同的函数。

我个人建议始终使用??而不是默认值。由于它允许非恒定值,因此它更加灵活。对于非功能默认值,您必须记录默认行为,而不仅仅是让dartDoc显示{int x = 42},但是对于功能,则无论如何都必须记录它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为可选的Range参数设置默认值?

如何为星号参数设置默认值?

如何为DateTime参数设置默认值

如何为命名函数参数设置默认值?

如何为ChoiceParameterDefinition参数设置默认值

如何在Javascript中为可选参数设置默认值?

如何在关键字中为可选列表参数设置默认值

如果为空,如何为参数设置默认值?

如何为通过JavaScript中的对象文字模拟的命名函数参数设置默认值?

从元组参数设置元素参数的默认值

从python中的参数设置参数默认值

Android:如何为参数变量设置默认值

为哈希表参数设置默认值

如何根据URL参数设置下拉菜单的默认值?

如何在Scala中为varargs参数设置默认值?

如何在程序定义的架构中为参数设置默认值?

如何在Rails中为参数设置默认值?

如何为默认参数设置编写Shell脚本

设置参数的默认值和类型

如何为const设置默认值?

如何为ActiveAuthenticationSchemes设置默认值?

如何使用argparse为参数设置可选值?

如何为Typescript + React中的Object类型的可选嵌套prop提供默认值?

可选参数的默认值

如何为批量插入参数设置值?

局部抽象类型和可选参数的默认值

Bash可选参数并将其设置为默认值

如何同时使 TypeScript 解构函数参数、分配默认值和可选的整个对象类型?

如何将ActiveSheet,ActiveWorkbook或ThisWorkbook设置为VBA中可选参数的默认值?