Dart参数定义测试已弃用?
在Dart 1.0.0上,我刚刚尝试:Dart参数定义测试已弃用?,dart,conditional-statements,optional-parameters,Dart,Conditional Statements,Optional Parameters,在Dart 1.0.0上,我刚刚尝试: class MyClass { int x; bool b; MyClass(int x, [bool b = true]) { if(?b) { // ... } } } 我在?b部分遇到编译器错误: 参数定义测试(“?”运算符)已被弃用 那么,测试是否提供了参数的“新”方法是什么呢?参数定义测试操作符被弃用,因为它与检查null是多余的;省略的可选参数将获得值n
class MyClass {
int x;
bool b;
MyClass(int x, [bool b = true]) {
if(?b) {
// ...
}
}
}
我在?b
部分遇到编译器错误:
参数定义测试(“?”运算符)已被弃用
那么,测试是否提供了参数的“新”方法是什么呢?参数定义测试操作符被弃用,因为它与检查
null
是多余的;省略的可选参数将获得值null
,并且调用方可以显式地传递null
。因此,使用==null
:
class-MyClass{
int x;
布尔b;
MyClass(整数x,[bool b]){
如果(b==null){
//抛出异常或为b指定默认值
}
}
}
无法测试是否提供了参数。取消它的主要原因是,以这种方式转发呼叫非常复杂
通常首选的方法是使用null
作为“未给定”。这并不总是有效(例如,如果null
是有效值),并且不会捕获错误的参数。如果使用了null
,则该参数不得具有默认值。否则,参数不为null,但采用默认值:
foo([x=true,y])=>print($x,$y”);
foo();//打印“真,空”
因此,在您的情况下,您可能应该:
class-MyClass{
int x;
布尔b;
MyClass(整数x,[bool b]){
如果(b==null){//则视为未给定。
// ...
}
}
}
这使得新的MyClass(5,null)
和新的MyClass(5)
相同。如果您确实需要抓住第一个案例,则必须围绕类型系统:
class_Sentinel{const_Sentinel();}
...
MyClass(int x,[b=const\u Sentinel()]){
如果(b==const _Sentinel())b=true;
...
}
通过这种方式,您可以检查是否提供了参数。作为回报,您将丢失
b
上的类型,这不是最好的,因为您忽略了类型注释。这需要额外的类型兼容性测试。当传递类型错误的参数时,这无助于检查故障。调用此函数的代码始终需要在运行时进行测试,因为函数签名不清楚参数允许的类型。我是关于使用\u Sentinel
的示例(在该示例中,无法在其库中区分新MyClass(x)和新MyClass(x,const\u Sentinel())。@mezoni:阅读最后一句。@Ganymede:是的,但如果这开始起作用,您还有其他问题。@FlorianLoitsch Loitsch,我就缺点发表了我的意见。有什么问题吗?