Scala tiende a fomentar el uso de cierres en lugar del tipo de ganchos del que está hablando (la mayoría de los cuales no puede implementarse convenientemente debido a tipeo y compilación estáticos).
Esto requiere que sepa de antemano dónde puede desearse la flexibilidad en el comportamiento común, pero es muy potente y fácil de usar cuando está disponible. Por ejemplo, suponga que tiene un método que imprime nombres de las personas:
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.
pero si lo que realmente va a estar cambiando de nombre imprimir una gran cantidad, usted es mejor que en la construcción:
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.
En una nota relacionada, vea también http://stackoverflow.com/questions/3105594/is-there-a-method-missing-in-scala – VonC