2013-03-30 62 views
1

我使用下面的样式类来模仿枚举(来自Does Dart support enumerations?) 它工作正常,因为这段代码产生了预期的结果。应该从const对象返回const值是否为const?

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

但是DartEditor在fromJson方法的case语句中抱怨“期望的常量表达式”。是否有我可以扔在某个地方摆脱这种投诉的常量?

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; 
    } 
    } 
} 

回答

2

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

使用当前的语法,没有办法表达一个类的字段永远是最终字段的(非正式)契约。例如,我可以将值字段更改为getter而不是字段。该类的界面合同绝对允许我这样做,因为我从来没有告诉任何人我会保持“价值”作为一个领域。但是,如果我这样做,它会打破依赖于这个最终领域存在的每一个程序。

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

但是:从理论上讲,可以改进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/打开一个错误,并建议这种行为。功能请求不太可能被接受,但绝对值得一试。

+0

如果我理解,建议是将'final int value'更改为'const value'。这样做的上面的例子给出:错误:第15行POS 9:常量字段'值'必须有一个初始值表达式 – user1338952

+0

正确。此行为尚不存在。您可以将其推荐为该语言的功能请求。 (重写的答案表明这一点)。 –

相关问题