我刚开始学习飞镖,只是在学习基础知识。
Dart-主页显示如下:
事实证明,Dart确实有一种方法来询问在调用该方法时是否提供了一个可选参数。只需使用问号参数语法。 下面是一个示例: 空alignDingleArm(num轴,num旋转){ if (?rotations) { //参数确实使用}}
因此,我编写了一个简单的测试脚本来学习:
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);
}省道编辑器已经将问题标记标记为错误:
Multiple markers at this line
- Unexpected token '?'
- Conditions must have a static type of
'bool'在Dartium中运行脚本时,JS-控制台显示跟踪错误:
Internal error: 'http://localhost:8081/main.dart': error: line 7 pos 8: unexpected token '?'
if(?printBefore){
^我知道,检查printBefore是否为null就足够了,但我想学习这种语言。
有人知道这个问题的原因吗?如何检查参数是否是手动设置的?
发布于 2015-06-15 06:07:18
这个特性在Dart的开发中存在,但是它被删除了,因为它造成的复杂性比删除的复杂,而没有解决实际需要解决的问题--默认参数的转发。
如果您有一个函数foo([x = 42]),并且您想要一个函数转发给它,bar([x]) => f(x);,那么,由于foo实际上可以判断x是否被传递,所以您实际上编写了bar([x]) => ?x ? foo(x) : foo();。这比没有?:操作符要做的事情还要糟糕。
关于拥有一个bar([x]) => foo(?:x)或者某个东西,如果它存在的话,而不是在它不存在的情况下(我不再记得实际提议的语法),提出了一些想法,但是这变得非常复杂,外汇将命名的参数转换为位置- 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.
}
}
}这是一个很大的解决办法,而且几乎不值得。通常,只要使用null作为默认值,它就更简单了。
发布于 2021-05-12 22:23:49
我也尝试过类似的方法:
,这不工作,
widget.optionalStringParameter ? widget.optionalStringParameter : 'default string'这工作
widget.optionalStringParameter != null ? widget.optionalStringParameter : 'default string'--这也适用于
widget.optionalStringParameter ?? 'default string'发布于 2015-06-14 14:41:00
支持检查可选参数是否在早期Dart (前1.0版)中实际上是提供程序,但由于它会引起一些问题而被删除。
https://stackoverflow.com/questions/30830592
复制相似问题