Dart 2 中的 const 何时是可选的?

Posted

技术标签:

【中文标题】Dart 2 中的 const 何时是可选的?【英文标题】:When is const optional in Dart 2? 【发布时间】:2019-03-05 23:24:23 【问题描述】:

在 Dart Object() 中构造函数被声明为 const 所以:

identical(const Object(), const Object()); //true

我知道在 Dart 2 中,关键字 const 是可选的,我认为前面的语句相当于:

identical(Object(), Object()); //false

但实际上它似乎相当于:

identical(new Object(), new Object()); //false

现在我的疑问是:

1) const 关键字何时是可选的?

2) 有什么方法可以确保我的类的实例在没有 const 关键字的情况下始终保持不变?这样我就可以获得:

indentical(MyClass(), MyClass()); //true (is it possible?)

【问题讨论】:

【参考方案1】:

Dart 2 允许您在任何地方省略 new。以前写new的地方,现在可以省略了。

Dart 2 还允许您在上下文暗示的位置省略 const。这些职位是:

const 对象内创建、映射或列表文字 (const [1, [2, 3]])。 在元数据中创建 const 对象 (@Foo(Bar())) 在 const 变量 (const x = [1];) 的初始化表达式中。 在 switch case 表达式中 (case Foo(2):...)。

语言还有两个地方需要常量表达式,但它们不会自动变为常量(出于各种原因):

    可选参数默认值 具有const 构造函数的类中最终字段的初始化表达式

1 没有被设为 const,因为我们希望保留让这些表达式在未来不需要成为 const 的选项。 2 是因为它是一个非局部约束 - 周围 表达式中没有任何东西表明它必须是 const,因此很容易,例如,从构造函数中删除 const 而没有注意到它改变了字段初始化器的行为。

【讨论】:

【参考方案2】:

constconst 上下文中是可选的。基本上,当表达式必须为 const 以避免编译错误时,就会创建 const 上下文

在下面的 sn-p 中你可以看到const 是可选的:

class A 
  const A(o);


main()
  // parameters of const constructors have to be const
  var a = const A(const A());
  var a = const A(A());

  // using const to create local variable 
  const b = const A();
  const b = A();

  // elements of const lists have to be const
  var c = const [const A()];
  var c = const [A()];

  // elements of const maps have to be const
  var d = const 'a': const A();
  var d = const 'a': A();


// metadatas are const
@A(const A())
@A(A())
class B 

您可以在Optional new/const 和Implicit Creation 中找到更多详细信息。

【讨论】:

以上是关于Dart 2 中的 const 何时是可选的?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]

URI 中的 Scheme 是可选的吗?

RESTful API 设计:更新 (PUT) 中的不可更改数据是不是应该是可选的?

Dart语法之可选参数

使用 'var' 声明变量是可选的吗? [复制]

读取中间名是可选的文件