2012-06-07 11 views
5

Sólo la implementación de un objeto dinámico (usando 2.10.0-M3):Scala campo dinámico llamada x

import language.dynamics 
object D extends Dynamic { 
    def selectDynamic(field : String) = Symbol(field) 
} 

El siguiente funciona bien y como era de esperar

object DynamicTest extends App { 
    println(D.a) 
} 

impresión 'un

Pero, si trato de esto:

object DynamicTest extends App { 
    println(D.x) 
} 

Tengo errores desagradables:

[error] DynProb.scala:7: type mismatch; 
[error] found : D.type 
[error] required: ?{val x: ?} 
[error] Note that implicit conversions are not applicable because they are ambiguous: 
[error] both method any2Ensuring in object Predef of type [A](x: A)Ensuring[A] 
[error] and method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A] 
[error] are possible conversion functions from D.type to ?{val x: ?} 
[error]  println(D.x) 
[error]   ^
[error] one error found 

¿Por qué x es tan especial? Estoy haciendo algo estúpido?

+1

Ese es el problema: https://github.com/scala/scala/blob/master/src/library/scala/Predef.scala#L271 – Debilski

+0

Por lo tanto, esencialmente tengo que vivir con eso hasta que la cosa se elimine realmente de la lib, no solo desaprobado. Vergüenza. Gracias por el puntero :-) – hughleat

+0

He aquí un pensamiento: suponiendo que Dynamic primero intenta encontrar un nombre adecuado en el alcance antes de probar selectDynamic, etc. ¿Debería evitar los nombres en desuso también? – hughleat

Respuesta

0

me ocurrió una solución simple por ahora:

import language.dynamics 
object D extends Dynamic { 
    def selectDynamic(field : String) = Symbol(field) 
    def x = selectDynamic("x") 
} 
D.x 

Devuelve la esperada

res2: Symbol = 'x 

me hubiera gustado volver a definir un rasgo llamado CompleteDynamic hacer esto "x" primordial variable, pero No podría por el momento.

Cuestiones relacionadas