检查,如果Dart中提供了可选参数

时间:2015-06-14 14:33:18

标签: syntax dart syntax-error

我是Dart的新手,只是学习基础知识。

Dart-Homepage显示以下内容:

  

事实证明,Dart确实有办法询问是否可选   调用方法时提供参数。只需使用   问号参数语法。

     

以下是一个例子:

void alignDingleArm(num axis, [num rotations]) {
  if (?rotations) {
    // the parameter was really used
  }
}

所以我写了一个简单的学习测试脚本:

import 'dart:html';

void main() {

  String showLine(String string, {String printBefore : "Line: ", String printAfter}){
    // check, if parameter was set manually:
    if(?printBefore){
      // check, if parameter was set to null
      if(printBefore == null){
        printBefore = "";
      }
    }
    String line = printBefore + string + printAfter;
    output.appendText(line);
    output.appendHtml("<br />\n");
    return line;
  }

  showLine("Hallo Welt!",printBefore: null);

}

Dart-Editor已将问号标记为错误:

Multiple markers at this line
- Unexpected token '?'
- Conditions must have a static type of 
 'bool'

在Dartium中运行脚本时,JS-Console显示以下错误:

Internal error: 'http://localhost:8081/main.dart': error: line 7 pos 8: unexpected token '?'
if(?printBefore){
   ^

我知道,检查printBefore是否为空就足够了,但我想学习这门语言。

有谁知道这个问题的原因? 如果参数是手动设置的,如何检查?

3 个答案:

答案 0 :(得分:4)

该功能在Dart的开发中已经存在,但它再次被删除,因为它导致了比删除更复杂的问题,而没有解决实际需要解决的问题 - 转发默认参数。

如果您有一个功能foo([x = 42]),并且您想要一个功能转发给它bar([x]) => f(x);,那么,因为foo实际上可以判断是否传递了x ,你实际上最终写了bar([x]) => ?x ? foo(x) : foo();。那是更糟,而不是没有?_运算符的情况。

想法出现了一个bar([x]) => foo(?:x)或某些东西,如果它存在而不是x(如果它不存在的话)(我不再记得实际提出的语法),但这很复杂,fx转换命名位置参数 - bar({x,y}) => foo(?:x, ?:y); - 如果提供了y并且x没有提供。这对于一个自己造成的问题来说真是一个糟糕的解决方案。

因此,?x功能已回滚。所有可选参数都有一个默认值,如果调用中没有匹配的参数,则传递该默认值。如果要转发可选参数,则需要知道要转发的函数的默认值。

对于大多数函数参数,声明的默认值为null,并使用内部if (arg == null) arg = defaultValue;语句来修复它。这意味着可以直接转发null值而不会产生任何混淆。

某些参数的默认值为非null。它主要是布尔参数,但也有其他情况。我建议使用null除了命名布尔参数之外的所有内容(因为它们实际上意味着命名比它们可选的更多)。至少除非有充分的理由不这样做 - 比如确保所有子类对于方法参数具有相同的默认值(可能是一个很好的理由,或者不是,并且应该使用judiciosuly)

如果你有一个可选参数,也可以接受null作为一个值...考虑它是否真的应该是可选的,或者你只需​​要一个不同的函数再加一个参数。或许您可以引入不同的“缺失参数”默认值。例如:

abstract class C { foo([D something]); }
class _DMarker implements D { const _DMarker(); }
class _ActualC {
  foo([D something = const _DMarker()]) {
    if (something == const _DMarker()) {
      // No argument passed, because user cannot create a _DMarker.
    } else {
      // Argument passed, may be null.
    }
  }
}

这是一个很大的解决方法,几乎​​没有任何价值。通常,只需使用null作为默认值,它就更简单了。

答案 1 :(得分:0)

支持在Dart早期(1.0之前)检查可选参数是否真正是提供者,但是因为它会导致一些麻烦而被删除。

答案 2 :(得分:0)

我正在尝试类似的东西:

这不起作用

widget.optionalStringParameter ? widget.optionalStringParameter : 'default string'

这有效

widget.optionalStringParameter != null ? widget.optionalStringParameter : 'default string'

这也有效

widget.optionalStringParameter ?? 'default string'