I add variables with Dynamic from scala 2.10.0-RC1 like this:
import language.dynamics
import scala.collection.mutable.HashMap
object Main extends Dynamic {
private val map = new HashMap[String, Any]
def selectDynamic(name: String): Any = {return map(name)}
def updateDynamic(name:String)(value: Any) = {map(name) = value}
}
val fig = new Figure(...) // has a method number
Main.figname = fig
Now, if I want to access Main.figname.number it doesn’t work, because the compiler thinks it’s of type Any.
But it’s also Main.figname.isInstanceOf[Figure] == true, so it’s Any and Figure, but doesn’t have Figures abilities. Now I can cast it like, Main.figname.asInstanceOf[Figure].number and it works! This is ugly! And I can’t present this to my domain users (I’d like to build a internal DSL.)
Note: If I use instead of Any the supertype of Figure it doesn’t work either.
Is this a bug in scala 2.10, or a feature?
It is quite logical. You are explicitly returning instances of
Any. A workaround would be to have instances of Dynamic all along:Usage:
All instances are wrapped in a Dynamic instance.
We can recover the actual type using the
asmethod which performs a dynamic cast.