微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dart 编译器是否能够推断 const 构造函数的用法?

如何解决Dart 编译器是否能够推断 const 构造函数的用法?

我认为 dart 会使用 if not mdic.get('color_detail'): raise ValueError('No color_detail available') 构造函数(如果它能够自动执行),为了解释这个假设,假设我们有一个小部件,它已经有一个 const 像:

const constructor

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

1.

class Retry extends StatelessWidget {
  const Retry();
}
Container(
   child: Retry()
)

这是 dart 可以推断他必须对声明了该选项的类使用 Container( child: const Retry() ) 构造函数的假设吗?或者不是? 我如何证实它?

解决方法

不,Dart 编译器不会推断 const,除非语法上下文需要常量性,例如如果您编写 const [A()]A() 放入 const 上下文中,这意味着 const [A()]const [const A()] 相同,那么几乎没有其他地方可以应用相同的内容(例如元数据 { {1}})。

一般而言,Dart 编译器无法在语言规范要求的地方之外推断 @A(),因为它可能会改变程序的语义。考虑:

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

,

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

推断 const 的示例:

const SizedBox(
  child: Retry(),)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。