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
Syntax 检查Dart中是否提供了可选参数_Syntax_Dart_Syntax Error - Fatal编程技术网

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

Syntax 检查Dart中是否提供了可选参数,syntax,dart,syntax-error,Syntax,Dart,Syntax Error,我是Dart新手,只是在学习基础知识 以下内容显示: 事实证明,Dart确实有一种方法可以询问一个可选的 参数是在调用该方法时提供的。只要使用 问号参数语法 以下是一个例子: void alignDingleArm(num axis, [num rotations]) { if (?rotations) { // the parameter was really used } } 因此,我编写了一个简单的学习测试脚本: import 'dart:html'; void mai

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

以下内容显示:

事实证明,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);

}
在Dartium中运行脚本时,JS控制台显示以下错误:

Internal error: 'http://localhost:8081/main.dart': error: line 7 pos 8: unexpected token '?'
if(?printBefore){
   ^
我知道,检查printBefore是否为null就足够了,但我想学习这门语言

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

支持检查可选参数是否在Dart早期(1.0之前)实际上是提供程序,但由于它会导致一些问题而被删除

该功能在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
,如果(arg==null)arg=defaultValue,则为内部
语句来修复它。这意味着
null
值可以直接转发,而不会产生任何混淆

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

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

抽象类C{foo([D某物];}
类DMarker实现D{const DMarker();}
实际类{
foo([D something=const\u DMarker()])){
如果(something==const\u DMarker()){
//未传递参数,因为用户无法创建_-DMarker。
}否则{
//参数已传递,可能为空。
}
}
}

这是一个很大的解决办法,几乎不值得。一般来说,只需使用
null
作为默认值,就更简单了。

我也尝试过类似的方法:

这不起作用

widget.optionalStringParameter ? widget.optionalStringParameter : 'default string'
这很有效

widget.optionalStringParameter != null ? widget.optionalStringParameter : 'default string'
widget.optionalStringParameter ?? 'default string'
这同样有效

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

为什么需要不同的
null
类型。实际知道是否设置了值的用例是什么?接线员没有很好地处理呼叫转接。也就是说,转发带有可选参数的调用需要指数级(参数数量)的代码量。不幸的是,当属性设置为
null
有效时,这似乎无法实现
copyWith
方法。其中一个必须使用
null
-coalescing运算符,因此为该属性传入
null
将忽略它并使用现有的非
null
值。是的,这是一个不幸的副作用。如果所有值都有效,则无法区分实际的
null
值和省略的值。在这种情况下,您可能希望引入一个私有标记类并使用该类的实例作为默认参数,这样您就知道客户端不可能传递该类的实例,因此默认值可以与任何客户端值区分开来。如果您的参数是类型化的,那么每个类型可能需要一个类(对于
Foo
参数的默认值,您可以执行
class\u XMarker extends\u Marker implements Foo
)。如果类型为
int
,则您将被卡住:(