Scala风格指南:为什么要模仿一个功能?

时间:2015-05-31 13:50:15

标签: scala

我正在阅读Scala风格指南:http://docs.scala-lang.org/style/naming-conventions.html

他们提到了这个:

  

对象

     

对象遵循类命名约定(camelCase with a   资本首字母)除了试图模仿一个包或一个   功能。这些情况并不经常发生,但可以预期   一般发展。:

object ast {
  sealed trait Expr
  case class Plus(e1: Expr, e2: Expr) extends Expr
  ...
}
object inc {
  def apply(x: Int): Int = x + 1
}

对于"对象ast"我可能会想到一些简单的用例。但我无法想到为什么有人想要模仿一个功能"以"对象inc"的方式。感觉有点不合常规,可能会让其他开发人员感到困惑。

是否存在核心Scala库执行此操作的示例情况?或者什么时候定义这样的函数是好的做法?

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,一个很好的例子是shapeless.Poly函数。

Poly函数是函数的多态版本。它需要被表示为一个对象有三个主要原因:

  • 它包含多个函数(处理多个案例,因为它们具有多态性)
  • 对象的伴随对象是对象本身。这允许将各种情况定义为对象内部的隐式方法,并由编译器选择它们
  • objects provide a stable identifier,因此编译器在将函数实例传递给任何无形方法时都不会抱怨

除了技术性之外,它们在概念上起作用,因此使用相同的常规函数​​命名方式。