Ana*_*jon 6 syntax syntax-error dart
我是Dart的新手,只是学习基础知识。
该镖首页显示以下内容:
事实证明,Dart确实有一种方法来询问在调用该方法时是否提供了可选参数。只需使用问号参数语法即可。
这是一个例子:
Run Code Online (Sandbox Code Playgroud)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);
}
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就足够了,但是我想学习这种语言。
有人知道这个问题的原因吗?如何检查参数是否手动设置?
该功能在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用作默认值即可。
| 归档时间: |
|
| 查看次数: |
2668 次 |
| 最近记录: |