在Dart 1.0.0上,我试过了:
class MyClass {
int x;
bool b;
MyClass(int x, [bool b = true]) {
if(?b) {
// ...
}
}
}
我在?b
部分收到编译错误:
参数定义测试('?'运算符)已被弃用
那么测试参数是否被提供的“新”方法是什么?
答案 0 :(得分:3)
无法测试是否提供了参数。删除它的主要原因是,以这种方式转发呼叫非常复杂。
通常首选的方法是使用null
作为“未给出”。这并不总是有效(例如,如果null
是有效值),并且不会捕获错误的参数。如果使用null
,则参数不得具有默认值。否则,参数不为null,而是采用默认值:
foo([x = true, y]) => print("$x, $y");
foo(); // prints "true, null"
所以在你的情况下你应该这样做:
class MyClass {
int x;
bool b;
MyClass(int x, [bool b]) {
if(b == null) { // treat as if not given.
// ...
}
}
}
这使new MyClass(5, null)
和new MyClass(5)
相同。如果你真的需要抓住第一个案例,你必须解决类型系统:
class _Sentinel { const _Sentinel(); }
...
MyClass(int x, [b = const _Sentinel()]) {
if (b == const _Sentinel()) b = true;
...
}
这样您就可以检查是否已提供参数。作为回报,您将失去b
上的类型。
答案 1 :(得分:2)
不推荐使用参数定义测试运算符,因为它在检查null
时是多余的;省略的可选参数将获得值null
,并且调用者无论如何都可以明确地传递null
。因此,请使用== null
:
class MyClass {
int x;
bool b;
MyClass(int x, [bool b]) {
if (b == null) {
// throw exception or assign default value for b
}
}
}