我最近一直在阅读很多其他人的 Scala 代码,而我遇到的困难之一(来自 Java)是缺少显式类型注释。
在编写代码以省略类型注释时当然很方便——但是在阅读代码时,我经常发现显式类型注释可以帮助我一目了然地理解代码在做什么。
Scala 风格指南(http://docs.scala-lang.org/style/types.html)似乎没有提供任何明确的指导,指出:
Use type inference where possible, but put clarity first, and favour explicitness in public APIs.
在我看来,这有点矛盾。虽然很明显这个变量是什么类型:
val tokens = new HashMap[String, Int]
这不是很明显这是什么类型:
val tokens = readTokens()
因此,如果我首先要清楚,我可能会注释所有尚未在同一行上声明类型的变量。
有任何 Scala 从业者对此有指导吗?考虑向我的局部变量添加类型注释是不是疯了?我特别想听听那些花费大量时间阅读 scala 代码(例如,在代码审查中)以及编写它的人的来信。
最佳答案
It's not so obvious what type this one is:
val tokens = readTokens()
好名字很重要:名字是复数,因此它返回某种集合。 Scala 中最通用的集合类型是
Traversable
和 Iterator
,并且它们大多共享一个通用接口(interface),因此两者中的哪一个并不重要。该名称还涉及“阅读 token ”,因此显然应该返回 Token
以某种方式。最后但并非最不重要的一点是,方法调用有括号,根据样式指南,这意味着它有副作用,所以我不会指望能够多次遍历集合。因此,返回类型类似于
Traversable[Token]
或者
Iterator[Token]
两者中的哪一个并不重要,因为它们的客户端界面大多相同。
另请注意,后一种约束(仅遍历集合一次)甚至没有在类型中捕获,即使您提供了显式类型,您仍然需要查看名称和样式!
关于Scala:何时使用显式类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26812028/