Scala 倾向于鼓励使用闭包,而不是您所说的钩子类型(由于静态类型和编译,大多数钩子无法方便地实现)。
这需要您提前知道哪些地方可能需要通用行为的灵活性,但它非常强大且在可用时易于使用。例如,假设您有一个打印出人名的方法:
case class Name(first: String, last: String) {
def title = last + ", " + first(0).toUpper + "."
}
trait Familiar extends Name {
override def title = first + " " + last(0).toUpper + "."
}
def listing(names: Array[Name]) = names.foreach(name => println(name.title))
val jd1 = new Name("John","Doe)
listing(Array(jd1)) // Prints Doe, J.
val jd2 = new Name("John","Doe") with Familiar
listing(Array(jd2)) // Prints John D.
但是,如果您真的要大量更改名称打印,则最好将其构建在:
case class Name(first: String, last: String) {
def title = last + ", " + first(0).toUpper + "."
}
def listing(names: Array[Name], address: Name => String = _.title) =
names.map(address).foreach(println)
val jd = new Name("John", "Doe")
listing(Array(jd)) // Uses default, so prints Doe, J.
listing(Array(jd), n => n.first + " " + n.last(0).toUpper + ".") // Prints John D.