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

标签 scala types

我最近一直在阅读很多其他人的 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 中最通用的集合类型是 TraversableIterator ,并且它们大多共享一个通用接口(interface),因此两者中的哪一个并不重要。该名称还涉及“阅读 token ”,因此显然应该返回 Token以某种方式。最后但并非最不重要的一点是,方法调用有括号,根据样式指南,这意味着它有副作用,所以我不会指望能够多次遍历集合。

因此,返回类型类似于
Traversable[Token]

或者
Iterator[Token]

两者中的哪一个并不重要,因为它们的客户端界面大多相同。

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

关于Scala:何时使用显式类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26812028/

相关文章:

scala - 如何使用抽象类型的类型约束

c# - 如何检查类型是子类型还是对象的类型?

c# - 知道类型参数是否在 c# 2.0 中实现接口(interface)的更简单方法是什么?

haskell - Haskell 如何对无限递归值进行类型检查?

存在类型的 Scala 类型推断

scala隐式返回值问题

Scala 替代案例将语法与不同类型的提取值匹配

scala - Spark File Streaming 获取文件名

scala - Scala 中的 monad 中的可重入锁

c++ - boost::any 类型支持有限