为什么我不能用 Dart 中作为函数参数接收的原始值来初始化 "const" 变量?
Why can't I initialize a "const" variable with a primitive value received as a function argument in Dart?
我了解到,在 Dart 中,原语是按值传递的,而对象是按引用传递的。
所以,我预计
void test(String phrase) {
const _phrase = phrase;
}
会导致错误,但是
void test(int amount) {
const _amount = amount;
}
不会。
但是,它们都抛出相同的编译时错误:Const variables must be initialized with a constant value
.
这是某些未实现的功能还是在 const 变量初始化中不接受函数参数背后的原因?
我相信答案是常量在编译时而不是 运行 时是固定的,所以函数参数不能传递给它们,因为函数只在 运行 时执行。
例如,另请参见此处
不过,用 final 修饰符代替 const 也可以。
顺便说一下,我认为 String 也是一种原始类型。看这里
Dart 常量变量必须使用编译时常量表达式进行初始化。
编译时常量表达式必须 始终 具有相同的值——每个 源位置.
恰好一个值
Dart 没有这样的“常量值”。它有常量表达式,众所周知,这些表达式可以精确地计算出一个值,并且可以在编译时知道这个值。这允许编译器规范化这些常量值,因此评估为具有相同 state 的常量对象的不同常量表达式被规范化为相同的 object。
您的 amount
变量不是编译时常量表达式。它在不同的时间可以有不同的值(因为它是一个函数参数,人们可能会用不同的参数调用函数),所以它不能是一个常量表达式。
因此不能用来初始化常量变量,因为常量变量只能有一个值。
void test(int amount) {
const _amount = amount;
const list = [_amount]; // <- MUST ALWAYS HAVE SAME VALUE
}
简而言之:Dart 常量变量必须使用编译时常量表达式进行初始化。常量表达式必须始终具有相同的值。这是关于 Dart 常量表达式的基本规则,大多数其他限制都源于此。 (例如,正在使用的常量变量是常量表达式,因此它必须始终绑定到相同的值,这就是为什么必须使用常量表达式对其进行初始化的原因。)
我了解到,在 Dart 中,原语是按值传递的,而对象是按引用传递的。
所以,我预计
void test(String phrase) {
const _phrase = phrase;
}
会导致错误,但是
void test(int amount) {
const _amount = amount;
}
不会。
但是,它们都抛出相同的编译时错误:Const variables must be initialized with a constant value
.
这是某些未实现的功能还是在 const 变量初始化中不接受函数参数背后的原因?
我相信答案是常量在编译时而不是 运行 时是固定的,所以函数参数不能传递给它们,因为函数只在 运行 时执行。
例如,另请参见此处
不过,用 final 修饰符代替 const 也可以。
顺便说一下,我认为 String 也是一种原始类型。看这里
Dart 常量变量必须使用编译时常量表达式进行初始化。 编译时常量表达式必须 始终 具有相同的值——每个 源位置.
恰好一个值Dart 没有这样的“常量值”。它有常量表达式,众所周知,这些表达式可以精确地计算出一个值,并且可以在编译时知道这个值。这允许编译器规范化这些常量值,因此评估为具有相同 state 的常量对象的不同常量表达式被规范化为相同的 object。
您的 amount
变量不是编译时常量表达式。它在不同的时间可以有不同的值(因为它是一个函数参数,人们可能会用不同的参数调用函数),所以它不能是一个常量表达式。
因此不能用来初始化常量变量,因为常量变量只能有一个值。
void test(int amount) {
const _amount = amount;
const list = [_amount]; // <- MUST ALWAYS HAVE SAME VALUE
}
简而言之:Dart 常量变量必须使用编译时常量表达式进行初始化。常量表达式必须始终具有相同的值。这是关于 Dart 常量表达式的基本规则,大多数其他限制都源于此。 (例如,正在使用的常量变量是常量表达式,因此它必须始终绑定到相同的值,这就是为什么必须使用常量表达式对其进行初始化的原因。)