【发布时间】:2020-03-08 11:48:54
【问题描述】:
我又花了几个小时在飞镖程序中发现一个奇怪的行为。
我问我以下原因,以及在编译器级别是否有事情要做。
该代码只是关于在 Map 中设置和删除条目并跟踪删除操作:
static void removeLock(String key) {
Lock lock = _locks.remove(key);
if (lock !=null) return
print ( " uniqueId $key was not locked ");
}
地图文档说,如果该对象在删除之前就在地图中,则删除会返回该对象。
正如它所写的那样,代码一直表明密钥不在地图中。
原始错误很明显:开发人员忘记在返回后放置分号:
if (lock !=null) return ;
第一个问题是:为什么编译器没有检测到?
我的分析是Dart尝试返回print调用的结果,是无效的,所以用方法的签名就ok了。 QED。
问题二:有什么方法可以防止这样的错误;
为什么允许对 return 语句进行 void 函数调用?
这是一个真正的用例吗?
【问题讨论】:
-
通常建议对所有控制结构始终使用大括号。您可以通过激活以下 Linter 提示让分析器检测丢失的括号:dart-lang.github.io/linter/lints/…
-
我还想总体上推荐包含来自包 pedantic 或 extra_pedantic 的 Linter 提示(我个人使用最后一个)。使用此提示的优点是它们提示您的代码在结构上更一致且更具可读性。
-
很多东西都是由不同的人推荐的,甚至经常是相互矛盾的东西。如果整个控制流结构适合一行,则 Dart 样式指南会使用 allow omitting the braces。
标签: dart