考虑以下代码:
class Person {
String id;
String name;
ConnectionFactory connectionFactory;
// What is this constructor doing?
Person({this.connectionFactory: _newDBConnection});
}
Run Code Online (Sandbox Code Playgroud)
如果在构造函数的参数之前this,相应的字段将自动初始化,但为什么{...}呢?
Gün*_*uer 29
这使得参数成为命名的可选参数.
当你实例化Person你可以
Person p;
p = new Person(); // default is _newDbConnection
p = new Person(connectionFactory: aConnectionFactoryInstance);
Run Code Online (Sandbox Code Playgroud)
{}参数将是强制性的[]参数将是一个可选的位置参数 // Constructor with positional optional argument
Person([this.connectionFactory = _newDBconnection]);
...
Person p;
p = new Person(); // same as above
p = new Person(aConnectionFactoryInstance); // you don't specify the parameter name
Run Code Online (Sandbox Code Playgroud)
命名的可选参数对于布尔参数非常方便(当然对于其他情况也是如此).
p = new Person(isAlive: true, isAdult: false, hasCar: false);
Run Code Online (Sandbox Code Playgroud)
有一个特定的顺序可以使用这些参数类型:
请注意,位置和命名可选参数对默认值使用不同的分隔符.命名需要:但位置要求=.语言设计者认为冒号更符合Map文字语法(我至少会对两者使用相同的分隔符).
=从Dart 2开始支持作为分隔符,并根据样式指南进行首选,同时:仍然支持.
也可以看看:
X. *_*ang 13
Dart 函数允许使用位置参数、命名参数以及可选的位置和命名参数,或者它们的组合。
位置参数简单无装饰:
void debugger(String message, int lineNum) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
命名参数意味着当你调用一个函数时,你将参数附加到一个标签上。此示例调用具有两个命名参数的函数:
debugger(message: 'A bug!', lineNum: 44);
Run Code Online (Sandbox Code Playgroud)
命名参数的写法略有不同。将任何命名参数括在花括号中({ })。这一行定义了一个带有命名参数的函数:
void debugger({String message, int lineNum}) {
Run Code Online (Sandbox Code Playgroud)
默认情况下,命名参数是可选的。但是您可以对它们进行注释并使它们成为必需:
Widget build({@required Widget child}) {
//...
}
Run Code Online (Sandbox Code Playgroud)
最后,您可以传递可选的位置参数,使用[ ]:
int addSomeNums(int x, int y, [int z]) {
int sum = x + y;
if (z != null) {
sum += z;
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
您可以这样调用该函数:
addSomeNums(5, 4)
addSomeNums(5, 4, 3)
Run Code Online (Sandbox Code Playgroud)
您可以使用=函数签名中的运算符为参数定义默认值,该函数可以简化如下:
addSomeNums(int x, int y, [int z = 5]) => x + y + z;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3412 次 |
| 最近记录: |