software - Entendiendo por qué "Pimp my library" se definió de esa manera en Scala
scala vs java (2)
Si quiero agregar un método a una clase en Scala, necesito hacer algo como:
class RichFoo(f: Foo) {
def newMethod = f.bar()
}
object RichFoo {
implicit def foo2Rich(f: Foo) = new RichFoo(f)
}
Entonces, f.newMethod
generará RichFoo
instancia de RichFoo
y llamará a su método.
Estoy tratando de entender por qué no se definió de manera similar a Ruby:
override class Foo {
def newMethod = bar
}
El compilador puede ver esta definición y crear una clase FooOverride con el método estático newMethod que obtiene un parámetro de tipo Foo y llama a su método de barra. Así es como Scala implementa los rasgos. Todavía necesito importar el paquete que contiene el reemplazo de Foo para usarlo.
Parece que implica menos escritura, no requiere que invente nombres y tiene un mejor rendimiento (no llamar a un método y crear un objeto). Cualquier cosa que haga el método de conversión implícita puede hacerse dentro del método adicional.
Estoy seguro de que me he perdido algo y me gustaría tener una idea de qué.
¿Cómo evita que el método entre en el alcance sin requerir una importación explícita y darle un nombre? De hecho, ¿cómo puede un programa saber qué métodos se agregaron sin hacerlo?
Cuando usa tres bibliotecas diferentes, dos de las cuales agregan métodos a la tercera de una manera incompatible, ¿cómo lo solucionaría sin tener implicaciones bajo control?
Aparte de eso, no es posible un mejor rendimiento, ya que JVM no permite cambiar una clase existente. En el mejor de los casos, podría obtener el beneficio de no tener que inventar un nombre y tener que escribir menos a costa de no poder controlar lo que se está haciendo.
Como nota final, si quieres corto, puedes hacer:
implicit def fooBar(f: Foo) = new { def newMethod = bar }
Hay otros usos para las conversiones implícitas que no sean solo el lenguaje "pimp my library", por lo que no es realmente un caso de "¿por qué no hicieron esto en su lugar?", Pero "¿por qué no hicieron esto también?" . Ciertamente, no veo ninguna razón por la que no se pueda agregar la sintaxis de los métodos de extensión como usted sugiere, y probablemente sea algo más limpio, pero no hay mucha necesidad de hacerlo ya que el lenguaje ya es compatible con una forma de lograr el mismo efecto .
Actualización de octubre de 2011:
Hay una nueva propuesta para agregar azúcar de sintaxis para este caso de uso: http://scala.github.com/sips/pending/implicit-classes.html