Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart参数定义测试已弃用?_Dart_Conditional Statements_Optional Parameters - Fatal编程技术网

Dart参数定义测试已弃用?

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

在Dart 1.0.0上,我刚刚尝试:

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,我就缺点发表了我的意见。有什么问题吗?