Dart中const字符串相乘报错:为何需使用final而非const?
Dart中const与final的核心差异:为何字符串乘法不能用const初始化?
你遇到的问题核心在于Dart对const变量的初始化规则比final严格得多:
const变量要求初始化表达式是编译时常量表达式:
Dart的const变量的值必须在编译阶段就被完全确定,而且计算过程必须是编译器内置支持的、能在编译时直接执行的操作。虽然"Foo" * 20的逻辑很简单,但字符串乘法(重复字符串)的*运算符并不属于Dart定义的编译时常量运算范畴——编译器不会在编译时去执行这个字符串重复操作,哪怕操作数都是const常量。final变量只要求值不可变,初始化支持运行时计算:
final变量的约束仅仅是初始化后不能再修改它的值,它的初始化表达式可以是运行时才计算的结果。所以name * 20会在代码运行时执行字符串重复逻辑,生成结果后赋值给final变量,这完全符合final的规则。
如果想要用const定义重复后的字符串,只能通过直接写字面量(比如const String nameTimes20 = "FooFooFoo..."),目前没有Dart编译器认可的、能实现字符串重复的常量构造方法。
内容的提问来源于stack exchange,提问作者Salem Sinawi
相关产品推荐
相关产品推荐

