我是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编辑器已将问号标记为错误:

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();.这比你没有?:接线员时要做的事多了worse.

出现了一些 idea ,如果x存在而不是不存在(我不再记得实际提议的语法),就会有一个bar([x]) => foo(?:x)或类似的东西传递给x,但这很快就变得复杂起来,FX将命名参数转换为位置参数-bar({x,y}) => foo(?:x, ?:y);-如果提供y,而不提供x怎么办.对于一个自己造成的问题来说,这真的是一个糟糕的解决方案.

因此,回滚了?x功能.所有可选参数都有一个默认值,如果调用中没有匹配的参数,则会传递该默认值.如果要转发可选参数,则需要知道要转发到的函数的默认值.

对于大多数函数参数,声明的默认值为null,并使用内部if (arg == null) arg = defaultValue;语句进行修复.这意味着null值可以在没有任何念力的情况下直接转发.

某些参数的默认值不是null.这主要是布尔论据,但也有其他情况.我建议除命名布尔参数之外的所有参数都使用null(因为它们实际上应该比可选的多named).至少除非有很好的理由不这样做-比如确保所有子类对于方法参数都有相同的默认值(may是一个很好的理由,或者不是,应该明智地使用).

如果您有一个也可以接受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作为默认值,这样会更简单.

Dart相关问答推荐

当 ng-repeat 嵌套在 AngularDart 中时访问外部 $index

如何在 Dart 中实现继承?

跳过 JavaScript 直接进入 Dart

Dart中有没有类似python 字典(dictionary) struct ?

如何为 spawnUri 动态构建 Dart 脚本?

如何用 Flutter 在同屏路由上制作英雄风格的动画?

Flutter 如何移动文件

Package:flutter/src/widgets/overlay.dart':Failed assertion: line 133 pos 12: "_overlay != null"

如何在Dart中switch 枚举?

Flutter 中 ChangeNotifier 的构建器小部件

Dart:默认 gitignore?

GestureDetector onTap 卡

在 Dart 中编写单元测试的最佳方式是什么?

Dart 工厂构造函数 - 它与const构造函数有何不同

Dart 中的 final 修饰符有什么作用?

为什么不推荐使用 context2d.backingStorePixelRatio?

dart中的max/mi int/double 值是否有常数?

Exception: Concurrent modification during iteration: Instance(length:17) of '_GrowableList';

Dart 中的 urlencoding

Dart 中的const和final关键字有什么区别?