gpt4 book ai didi

syntax - 检查,如果在 Dart 中提供了可选参数

转载 作者:行者123 更新时间:2023-12-04 14:57:25 24 4
gpt4 key购买 nike

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

Dart-Homepage显示如下:

It turns out that Dart does indeed have a way to ask if an optional parameter was provided when the method was called. Just use the question mark parameter syntax.

Here is an example:

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 是否为空就足够了,但我想学习这门语言。

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

最佳答案

该特性在 Dart 开发的某个时候就存在,但它再次被删除,因为它比删除更复杂,没有解决实际需要解决的问题——默认参数的转发。
如果您有函数 foo([x = 42])并且你想要一个函数转发给它,bar([x]) => f(x); ,那么,由于 foo实际上可以判断 x通过与否,你实际上最终写了bar([x]) => ?x ? foo(x) : foo(); .这比没有 ?: 的情况更糟糕。运算符(operator)。
关于拥有一个 bar([x]) => foo(?:x) 的想法出现了或者如果它存在而不是如果它不存在则传递到 x 上的东西(我不再记得实际提出的语法),但是这变得复杂快速,fx 将命名参数转换为位置 - bar({x,y}) => foo(?:x, ?:y); - 如果 y提供和 x不是。对于自己造成的问题,这真的只是一个糟糕的解决方案。
所以,?x功能已回滚。所有可选参数都有一个默认值,如果调用中没有匹配的参数,则传递该默认值。如果要转发可选参数,则需要知道要转发到的函数的默认值。
对于大多数函数参数,声明的默认值是 null ,带有内部 if (arg == null) arg = defaultValue;声明来修复它。这意味着 null value 可以直接转发,没有任何混淆。
某些参数具有非 null默认值。它主要是 bool 参数,但也有其他情况。我建议使用 null除了命名的 bool 参数之外的所有内容(因为它们实际上意味着命名而不是可选)。至少除非有充分的理由不这样做——比如确保所有子类对方法参数具有相同的默认值(这可能是一个很好的理由,也可能不是,并且应该明智地使用)。
如果你有一个可选参数也可以接受 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作为默认值,它更简单。

关于syntax - 检查,如果在 Dart 中提供了可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30830592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com