2011-05-15 25 views
8

¿Por qué no funciona lo siguiente? (Sí, estoy trabajando con 2.9.0final y la vuelta a la "-Xexperimental" opción.)Conversión implícita de cualquiera a dinámico

implicit def any2Dynamic(a: Any) = new Dynamic { 
    def applyDynamic(name: String)(args: Any*) = { 
    println(a + name) 
    } 
} 

"Say".hello // value hello is not a member of java.lang.String 

Uno puede discutir sobre lo significativo que esto es ... Si esto funcionaría como se esperaba lo la precedencia tendrá lugar en "Say".toInt: StringLike.toInt o (new Dynamic {...}).applyDynamic("toInt")?

Respuesta

9

El compilador primero looks para una vista implícita de String => { def hello: ? }. Eso falla, entonces checks si String <: Dynamic. Estos no están combinados.

Esta función de aplicación dinámica no se ha finalizado; en Scala 2.9.0 es experimental y está sujeta a cambios. Pero dudo que esto se incluya, como con un implícito, arrojas todo tipo de seguridad por la ventana. Nunca obtendría un error de compilación para los nombres de métodos mal escritos o los tipos de argumentos incorrectos. ¿Cuál es tu caso de uso?

+1

Su derecho con la seguridad del tipo. Pero, ¿qué sucede si restrinjo la definición implícita a mi caso de uso? Implícita def X2Dynamic (x: X) = nueva X {...} '(mi problema permanece, tipo problema de seguridad restringido a' X') para construir una DSL con dinámica invocación, por lo que uno puede invocar métodos que, por ejemplo, definido externamente en xml. Solo un experimento en mente hasta ahora ... Por cierto, ¡gracias por los enlaces a la fuente! –

+1

De hecho, creo que este tipo de comportamiento es genial. Puede permitir el uso de capacidades de lenguaje dinámico en un ámbito estrecho. Ideal para scripts o DSL. – IttayD

+0

@IttayD Me, también;) Al menos tenerlo en cuenta cuando se trata de una respuesta sofisticada a una pregunta decente aquí en SO. –

Cuestiones relacionadas