Scala:何时使用显式类型注释

4
最近我阅读了很多其他人的Scala代码,其中一个让我感到困难(来自Java)的事情是缺乏显式类型注释。
在编写代码时能够省略类型注释当然很方便 - 但是在阅读代码时,我经常发现显式类型注释能够帮助我更轻松地一眼了解代码正在做什么。
Scala风格指南(http://docs.scala-lang.org/style/types.html)似乎没有提供任何明确的指导,声明:
使用类型推断,但首先要清晰,并且在公共API中优先考虑明确性。
在我的看法中,这有点矛盾。虽然这个变量的类型显然很明显:
val tokens = new HashMap[String, Int]

这个类型不是那么明显:

val tokens = readTokens()

如果我把清晰度放在第一位的话,我可能会在同一行上注释所有未声明类型的变量。
Scala的从业者有没有关于此的指导?我考虑给我的本地变量添加类型注释是否疯了?我特别想听听那些花费大量时间阅读Scala代码(例如在代码审查中)以及编写代码的人的意见。

3
据我所见,Scala社区在许多风格问题上仍存在分歧。找到一种你和你的团队都清晰明了且喜欢的风格,坚持使用它! - Ben Reich
4
我觉得风格指南中特别重要的一部分是有关公共字段/方法的内容。在那里依赖类型推断可能会破坏封装性,这是一个严重的问题。对于任何本地或私有的内容,如果我真的有疑问,我只会依赖我的IDE来为我推断类型,所以这对我来说没有什么影响 - 如果需要记录一些意外情况,我只会在私有方法或字段上使用显式类型注释。 - Cyäegha
1个回答

4

It's not so obvious what type this one is:

val tokens = readTokens()

好的名称很重要:名称是复数形式,因此它返回某种集合。 Scala中最常见的集合类型是 Traversable Iterator ,它们基本上共享一个公共接口,因此真正重要的是这两个中的哪一个。名称还涉及“读取令牌”,因此它显然应以某种方式返回 Token 。最后但并非最不重要的是,方法调用带有括号,根据样式指南意味着它具有副作用,因此我不指望能够多次遍历集合。

因此,返回类型类似于

Traversable[Token]

或者
Iterator[Token]

两者之间的区别并不重要,因为它们的客户端接口基本相同。

另外需要注意的是,即使您提供了显式类型,后一个约束(仅遍历集合一次)也没有被捕获在类型中,您仍然需要查看名称和样式!


这是一个很好的观点。在深入学习Scala之前,Python和Javascript是我主要使用的语言。因为这些语言没有内置类型注释,所以我发现依靠良好的命名选择来保持程序可读性非常有用。例如,对于返回Map [String,Int]readTokens函数,我可能会将其命名为countsByToken - acjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接