我最近一直在阅读很多其他人的Scala代码,其中我难以接受的一件事(来自Java)是缺乏明确的类型注释。
编写代码以便能够省略类型注释时,这当然很方便 - 但是在阅读代码时,我经常会发现显式类型注释有助于我一目了然地了解代码的作用是什么。Scala风格指南(http://docs.scala-lang.org/style/types.html)似乎没有提供任何明确的指导,说明:
尽可能使用类型推断,但首先要明确,并在公共API中支持显式。
在我看来,这有点矛盾。虽然这个变量的类型很明显,但是很清楚:
val tokens = new HashMap[String, Int]
这个类型的类型并不那么明显:
val tokens = readTokens()
所以,如果我先说清楚,我可能会注释所有类型尚未在同一行上声明的变量。
任何Scala从业者都有此指导吗?我是否在考虑为我的局部变量添加类型注释?我特别感兴趣的是那些花大量时间阅读scala代码(例如代码审查)以及编写代码的人。
答案 0 :(得分:4)
这个类型的类型并不那么明显:
val tokens = readTokens()
好名字很重要:名字是复数,ergo它返回某种类型的集合。 Scala中最常用的集合类型是Traversable
和Iterator
,它们大多数共享一个公共接口,因此它不是真正重要的两个中的哪一个。这个名字还谈到了#34;阅读令牌",它显然应该以某种方式返回Token
。最后但并非最不重要的是,方法调用有括号,根据样式指南意味着它有副作用,所以我不会指望能够不止一次遍历集合。
Ergo,返回类型类似于
Traversable[Token]
或
Iterator[Token]
这两者中的哪一个并不重要,因为它们的客户端接口大多相同。
另请注意,后者约束(仅遍历集合一次)甚至不会在类型中捕获,即使 提供显式类型,您仍然 < / em>必须看看名称和风格!