【问题标题】:dart: enforce strongly typed comparisonsdart:强制执行强类型比较
【发布时间】:2019-06-14 17:55:33
【问题描述】:

我刚刚检查了 dart 代码,发现了一个难以发现的错误。它看起来像这样:

enum Day{
  Mon,
  Tue,
}

void main(){
  Day today = Day.Mon;

  if(today == 0){
    print("it's Monday");
  }
}

错误在于 dart 中的枚举不是整数。 Day 与任何整数的比较总是返回 false。

但是,对于 Java 开发人员来说,这可能看起来像是写得不好但有效的代码。在 Java 中,枚举基本上是整数。我认为在 Go 中也是如此。

Android Studio 已意识到该问题,并以灰色下划线标记了代码。如果你将鼠标悬停在这条线上,它会告诉你:

相等运算符== 调用不相关类型的引用。

视觉标记很容易被忽略,如果您在 Github 之类的地方进行代码审查,您可能根本看不到这一点。

我的问题是:我可以在比较中以某种方式强制执行类型安全吗? 理想情况下,我想指定一个编译器标志来捕捉这一点。 例如,以下 Rust 代码无法编译:

fn main() {
    println!("{}", "Hello, world!" == 0);
}

错误[E0277]:无法将&str 与{integer} 进行比较

在switch 语句中,编译器强制执行类型安全,这不会编译:

switch(today){
  case 1:
  //...
}

我也可以为 if 语句获得这种行为吗?

【问题讨论】:

  • 我可以建议将分析器添加到您的构建/集成/验证服务器中,这样您的一些分析器规则就会出错。在我的项目中,我实际上将所有 linter 警告都设为错误,因此如果分析器出现任何警告,我的提交将被标记为“失败”。

标签: dart


【解决方案1】:

编辑(或创建)您的 analysis_options.yaml 文件并添加 unrelated_type_equality_checks 的 lint 并将其视为错误:

linter:
  rules:
    - unrelated_type_equality_checks

analyzer:
  errors:
    unrelated_type_equality_checks: error

启用该功能后,对您的代码运行 dartanalyzer 应该会生成:

error • Equality operator `==` invocation with references of unrelated types at foo.dart:9:6 • unrelated_type_equality_checks

有关配置analysis_options.yaml 的更多信息,请参阅Customizing static analysis 的文档。您还可以查看 Supported Lint Rules 以获取支持的 lint 的完整列表。

【讨论】:

  • 太棒了,这真的很有用。谢谢:D
猜你喜欢
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2020-06-11
  • 2020-05-12
  • 2010-09-27
  • 2013-01-19
相关资源
最近更新 更多