首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查,是否在Dart中提供了可选参数。

检查,是否在Dart中提供了可选参数。
EN

Stack Overflow用户
提问于 2015-06-14 14:33:17
回答 3查看 11.7K关注 0票数 14

我刚开始学习飞镖,只是在学习基础知识。

Dart-主页显示如下:

事实证明,Dart确实有一种方法来询问在调用该方法时是否提供了一个可选参数。只需使用问号参数语法。 下面是一个示例: 空alignDingleArm(num轴,num旋转){ if (?rotations) { //参数确实使用}}

因此,我编写了一个简单的测试脚本来学习:

代码语言:javascript
复制
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);

}

省道编辑器已经将问题标记标记为错误:

代码语言:javascript
复制
Multiple markers at this line
- Unexpected token '?'
- Conditions must have a static type of 
 'bool'

在Dartium中运行脚本时,JS-控制台显示跟踪错误:

代码语言:javascript
复制
Internal error: 'http://localhost:8081/main.dart': error: line 7 pos 8: unexpected token '?'
if(?printBefore){
   ^

我知道,检查printBefore是否为null就足够了,但我想学习这种语言。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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作为值的可选参数.考虑它是否真的应该是可选的,或者仅仅需要一个不同的函数,再加上一个参数。或者您可以引入一个不同的“缺失参数”默认值。示例:

代码语言:javascript
复制
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作为默认值,它就更简单了。

票数 9
EN

Stack Overflow用户

发布于 2021-05-12 22:23:49

我也尝试过类似的方法:

,这不工作,

代码语言:javascript
复制
widget.optionalStringParameter ? widget.optionalStringParameter : 'default string'

这工作

代码语言:javascript
复制
widget.optionalStringParameter != null ? widget.optionalStringParameter : 'default string'

--这也适用于

代码语言:javascript
复制
widget.optionalStringParameter ?? 'default string'
票数 1
EN

Stack Overflow用户

发布于 2015-06-14 14:41:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30830592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档