检查,是否在Dart中提供了可选参数

Ana*_*jon 6 syntax syntax-error dart

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

镖首页显示以下内容:

事实证明,Dart确实有一种方法来询问在调用该方法时是否提供了可选参数。只需使用问号参数语法即可。

这是一个例子:

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

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

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);

}
Run Code Online (Sandbox Code Playgroud)

Dart编辑器已经将问号标记为错误:

Multiple markers at this line
- Unexpected token '?'
- Conditions must have a static type of 
 'bool'
Run Code Online (Sandbox Code Playgroud)

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

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

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

有人知道这个问题的原因吗?如何检查参数是否手动设置?

lrn*_*lrn 6

该功能在Dart的开发中曾存在过,但由于它引起的复杂性大于删除的功能,因此再次删除了该功能,而没有解决实际需要解决的问题-转发默认参数。

如果您有一个函数,foo([x = 42])并且想要一个函数转发给它,bar([x]) => f(x);那么,由于foo实际上可以确定是否x传递了该函数,因此您实际上结束了编写bar([x]) => ?x ? foo(x) : foo();。这比没有操作员时要做的还要糟糕?_

创意想出了大约有一个bar([x]) => foo(?:x)或一些东西,pased x上,如果它存在,而不是如果它是不存在的(我已经不记得实际提出的语法),但得到了复杂的快,FX将命名参数位置- bar({x,y}) => foo(?:x, ?:y);-什么,如果y是提供,x但没有。对于一个自我困扰的问题,这确实是一个糟糕的解决方案。

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

对于大多数函数参数,声明的默认值为null,并带有内部if (arg == null) arg = defaultValue;语句对其进行修复。这意味着该null值可以直接转发而不会造成任何混淆。

某些参数具有非null默认值。它主要是布尔参数,但也有其他情况。我建议null对除命名布尔参数之外的所有东西都使用(因为它们实际上是要被命名的,而不是可选的)。至少,除非有充分的理由,否则-像确保方法参数的所有子类都具有相同的默认值一样(这可能是个很好的理由,应该合理地使用)。

如果您有一个也可以接受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.
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个很大的解决方法,几乎​​是不值得的。通常,只需将其null用作默认值即可。

  • 不幸的是,这似乎使得在将属性设置为“null”有效时实现“copyWith”方法是不可能的。一种是被迫使用 `null` 合并运算符,因此为该属性传入 `null` 将改为忽略它并使用现有的非 `null` 值。 (4认同)