2012-06-07 6 views
5

Nur ein dynamisches Objekts Implementierung (mit 2.10.0-M3):Scala dynamisches Feld mit dem Namen x

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

Die folgende funktioniert und wie

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

Printing ‚ein

erwartet Aber, wenn ich das versuche:

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

Ich bekomme eklige Fehler:

[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 

Warum ist x so besonders? Ich mache etwas Dummes?

+1

Das ist das Problem: https://github.com/scala/scala/blob/master/src/library/scala/Predef.scala#L271 – Debilski

+0

Also muss ich im Wesentlichen damit leben, bis das Ding tatsächlich entfernt wird aus der lib, nicht nur veraltet. Schande. Danke für den Zeiger :-) – hughleat

+0

Hier ist ein Gedanke: Angenommen, dass Dynamic zuerst versucht, einen passenden Namen im Bereich zu finden, bevor Sie selectDynamic ausprobieren, usw. Sollte es auch veraltete Namen vermeiden? – hughleat

Antwort

0

Ich kam jetzt mit einer einfachen Lösung:

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

Gibt die erwarteten

res2: Symbol = 'x 

hätte ich liebte ein Merkmal CompleteDynamic dieses „x“ Variable überwiegenden zu tun namens neu zu definieren, aber Ich konnte nicht für den Moment.