Dart 编译器是否能够推断出 const 构造函数的用法?
Is Dart compiler able to infer the usage of const constructor?
我认为 dart 将使用 const
构造函数,如果它能够自动执行的话,为了解释这个假设让我们假设我们有一个已经有 const constructor
的小部件喜欢:
class Retry extends StatelessWidget {
const Retry();
}
然后因为 dart“能够推断出 const 用法”,接下来的两个代码将意味着并编译成相同的代码:
1.
Container(
child: Retry()
)
Container(
child: const Retry()
)
是否假设 dart 可以推断他必须对声明了该选项的 class 使用 const
构造函数?或者不是?
我怎样才能证实它?
Dart 无法推断出您希望该对象成为 const
,除非围绕它的某些上下文强制它成为 const
。在您显示的示例中情况并非如此。如果你想让 dart 做出一些东西,你 必须 在某些时候使用 const
关键字 const
.
推断的例子const
:
const SizedBox(
child: Retry(),
)
SizedBox
上的 const
强制 Retry
为 const
。这种情况和类似情况是唯一隐含 const
的地方。
不,Dart 编译器不会推断 const
除非句法上下文需要常量,例如如果您编写 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
.
我认为 dart 将使用 const
构造函数,如果它能够自动执行的话,为了解释这个假设让我们假设我们有一个已经有 const constructor
的小部件喜欢:
class Retry extends StatelessWidget {
const Retry();
}
然后因为 dart“能够推断出 const 用法”,接下来的两个代码将意味着并编译成相同的代码:
1.
Container(
child: Retry()
)
Container(
child: const Retry()
)
是否假设 dart 可以推断他必须对声明了该选项的 class 使用 const
构造函数?或者不是?
我怎样才能证实它?
Dart 无法推断出您希望该对象成为 const
,除非围绕它的某些上下文强制它成为 const
。在您显示的示例中情况并非如此。如果你想让 dart 做出一些东西,你 必须 在某些时候使用 const
关键字 const
.
推断的例子const
:
const SizedBox(
child: Retry(),
)
SizedBox
上的 const
强制 Retry
为 const
。这种情况和类似情况是唯一隐含 const
的地方。
不,Dart 编译器不会推断 const
除非句法上下文需要常量,例如如果您编写 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
.