【问题标题】:Is Dart compiler able to infer the usage of const constructor?Dart 编译器是否能够推断 const 构造函数的用法?
【发布时间】:2021-02-15 20:57:32
【问题描述】:

我认为 dart 将使用 const 构造函数,如果它能够自动执行,为了解释这个假设让我们假设我们有一个已经有一个 const constructor 的小部件,例如:

class Retry extends StatelessWidget {
  const Retry();
}

然后因为 dart “能够推断 const 用法”,接下来的两个代码都意味着并被编译成相同的代码:

1.

Container(
   child: Retry()
)
Container(
   child: const Retry()
)

这个假设是 dart 可以推断他必须为声明了该选项的类使用 const 构造函数吗?或者不是? 我怎样才能证实它?

【问题讨论】:

标签: flutter dart constants compiler-optimization inference


【解决方案1】:

不,Dart 编译器不会推断 const,除非语法上下文需要 constness,例如如果您编写 const [A()]A() 放入 const 上下文中,这意味着 const [A()]const [const A()] 相同,那么很少有其他地方也适用相同的情况(例如元数据 @A())。

一般来说,Dart 编译器不能在语言规范要求它这样做的地方之外推断const,因为它可能会改变程序的语义。考虑:

class A {
  const A();
}

final Set<A> s = <A>{};
void foo(A a) {
  s.add(a);
}

void main() {
  foo(A());
  foo(A());
  print(s.length);
}

如果编译器只是将const 放在构造函数调用上,那么该程序将打印1,但它应该打印2

【讨论】:

  • 感谢您的回答,但由于 christoper 在 cmets 中为答案添加了很多上下文,我将其标记为答案,但谢谢
【解决方案2】:

Dart 无法推断您希望该对象为const,除非它周围有一些上下文迫使它为const。在您展示的示例中,情况并非如此。你必须在某个时候使用const关键字,如果你想让dart做出一些东西const

推断const的示例:

const SizedBox(
  child: Retry(),
)

SizedBox 上的 const 强制 Retryconst。这种情况和类似情况是唯一隐含const 的地方。

【讨论】:

  • 为什么SizedBox 可以推断出这一点?如果您看到 Container 没有 const constructorRetry 确实有它
  • @DanielGomezRico 为了使 SizedBox 成为 const,它的所有属性也必须是 const,因此它将使用 Retry 的 const 构造函数。
  • 我希望Retry 被威胁为const 而不是Container,我知道它没有const 构造函数,我不确定问题是否不清楚够了
  • @DanielGomezRico 如果您希望Retry 成为const,您必须在某处使用const 关键字。所以在你的情况下你必须做const Retry。没有办法绕过它。您可以启用一些 linter 规则/警告来告诉您可以在哪里添加 const 我认为。
  • 谢谢你,我想知道是否有某种方法可以确定它,也许检查中间编译文件?我来自android,在那里我们可以看到编译后的文件,并确定编译后生成了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2017-07-02
  • 2015-02-22
  • 2023-02-17
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多