【发布时间】:2015-01-13 11:28:24
【问题描述】:
我知道 const 是 dart 中的编译时常量,但我不明白以下代码中 const [F0, F1, F2] 背后的机制:
class Foo {
static const F0 = 'F0';
static const F1 = 'F1';
static const F2 = 'F2';
// const list of const values I guess...
static const CONST_LIST = const [F0, F1, F2]; // please explain this line
static final String FOO = CONST_LIST[0]; // ok
// compile error: 'const' varaibles must be constant value
// static const String BAR = CONST_LIST[1];
}
main() {
// is CONST_LIST const or not?
// below line it's ok for dartanalyzer but
// in runtime: Cannot change the content of an unmodifiable List
Foo.CONST_LIST[1] = 'new value';
}
我注意到const [F0, F1, F2]; 中的 dart 分析器需要 const,但它确实使列表更像 final(运行时不可变列表)而不是编译时常量。
更新:
另一个问题是为什么CONST_LIST[1] 不是“恒定值”。请参阅Foo.BAR 的注释声明。
【问题讨论】:
-
Const 对象必须具有深度不变性。所以如果你有 const 变量,它应该引用由 const 对象组成的 const 对象。
-
是什么让你觉得这让它更像是一场决赛?
static const String BAR = CONST_LIST[1]的问题是常量表达式当前不支持数组访问器(请参阅dartbug.com/18389)。似乎是 Dart 分析器中的一个错误。 -
@JAre:CONST_LIST 中什么是可变的?它被声明为 const,所有值都是 const 的 const 列表。怎么可能更 const? ;-)
-
@GünterZöchbauer 分析器在分配“新值”时无法检测到问题。您指出的错误使其更加清晰。谢谢。