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

标签 dart

我使用下面的样式类来模仿枚举(来自 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)是对的。

使用当前语法,无法表达类的字段始终是最终字段的(非正式)约定。例如,我可以将值字段更改为 getter 而不是字段。该类的接口(interface)契约绝对允许我这样做,因为我从未告诉任何人我会将“值”保留为字段。但是,如果我这样做,就会破坏所有依赖此最终字段存在的程序。

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

但是:理论上可以改进 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/

相关文章:

flutter - 替换集合中的对象

dart - 如何确定我的 Polymer.dart 组件是否仍然是 document.activeElement?

从 1.60 更新到 1.72 : Failed to precompile intl:extract_to_arb 后,DART 发布失败

带有聚合物可观察场的 Dart mixin 可能吗?

flutter - 第一个项目中任务 ':app:processDebugManifest'的配置出现问题

firebase - flutter 网络 : White screen (PersistedOffset error)

flutter - Flutter 的垂直文本小部件

android - Flutter 如何将自己的 DartVM 用于原生应用

dart - dart2js 之后异步函数中两个 keyCode 的比较不正确

dart - 行中的多个 PageView 小部件