gpt4 book ai didi

dart - 从 const 对象返回的 const 值应该是 const 吗?

转载 作者:行者123 更新时间:2023-12-03 03:19:33 25 4
gpt4 key购买 nike

我正在使用下面的样式类来模仿枚举(来自 Does Dart support enumerations?)
它工作正常,因为这个片段产生了预期的结果。

void main() {
InterpolationType it = InterpolationType.LINEAR;
print("it is $it and stringified ${stringify(it)}");
print(InterpolationType.fromJson(it.toJson()));
}

但是 DartEditor 在 fromJson 方法的 case 语句中提示“预期的常量表达式”。有没有我可以在某处扔掉这个投诉的 const ?

class InterpolationType { 
static const LINEAR = const InterpolationType._(0);
static const STEP = const InterpolationType._(1);
static const CUBIC = const InterpolationType._(2);

static get values => [
LINEAR,
STEP,
CUBIC
];

final int value;

const InterpolationType._(this.value);

String toString() {
switch(this) {
case LINEAR: return "LINEAR";
case STEP: return "STEP";
case CUBIC: return "CUBIC";
}
}

int toJson() {
return this.value;
}

static InterpolationType fromJson(int v) {
switch(v) {
case LINEAR.value: return LINEAR;
case STEP.value: return STEP;
case CUBIC.value: return CUBIC;
}
}

static InterpolationType fromString(String s) {
switch(s) {
case "LINEAR": return LINEAR;
case "STEP": return STEP;
case "CUBIC": return CUBIC;
}
}
}

最佳答案

正如您所发现的:从 const 对象访问字段不是一个常量操作。所以编辑器(以及 VM 和 dart2js)是正确的。

使用当前的语法,没有办法表达一个(非正式的)契约,即类的字段将始终是 final 字段。例如,我可以将 value-field 更改为 getter 而不是字段。类的接口(interface)契约绝对允许我这样做,因为我从未告诉任何人我会将“值(value)”作为一个字段。但是,如果我这样做,它将破坏所有依赖于这个 final 字段存在的程序。

因此,当前的行为不太可能改变。

但是:理论上,可以改进 Dart 语言,以便您可以对本地字段使用“const”而不是“final”,并使用初始化列表对其进行初始化。在这种情况下,访问该字段可以被认为是一个常量操作。我目前看不出这种行为有任何不利之处,而且它是向后兼容的。

// WARNING: What follows DOES NOT WORK, just a potential example
class InterpolationType {
const value; // Note the "const" instead of "final".
const InterpolationType._(this.value);
}

该语言已经相当稳定,但您可以在 http://dartbug.com/ 处打开一个错误并提出这种行为。功能请求不太可能被接受,但绝对值得一试。

关于dart - 从 const 对象返回的 const 值应该是 const 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15719193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com