Dart参数定义测试已弃用?

时间:2014-01-01 01:25:51

标签: dart conditional-statements optional-parameters

在Dart 1.0.0上,我试过了:

class MyClass {
    int x;
    bool b;

    MyClass(int x, [bool b = true]) {
        if(?b) {
            // ...
        }
    }
}

我在?b部分收到编译错误:

  

参数定义测试('?'运算符)已被弃用

那么测试参数是否被提供的“新”方法是什么?

2 个答案:

答案 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
        }
    }
}