我是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是否为空就足够了,但我想学习这门语言。
有谁知道这个问题的原因? 如果参数是手动设置的,如何检查?
答案 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'