Scala中的动态属性

fer*_*olo 2 reflection scala dynamic

Scala是否支持动态属性?例:

val dog = new Dynamic // Dynamic does not define 'name' nor 'speak'.
dog.name = "Rex" // New property.
dog.speak = { "woof" } // New method.

val cat = new Dynamic
cat.name = "Fluffy"
cat.speak = { "meow" }

val rock = new Dynamic
rock.name = "Topaz"
// rock doesn't speak.

def test(val animal: Any) = {
   animal.name + " is telling " + animal.speak()
}

test(dog) // "Rex is telling woof"
test(cat) // "Fluffy is telling meow"
test(rock) // "Topaz is telling null"
Run Code Online (Sandbox Code Playgroud)

Scala最接近它的是什么?如果有类似"addProperty"的东西允许像普通字段一样使用添加的属性,那就足够了.

我对结构类型声明("类型安全鸭子打字")不感兴趣.我真正需要的是在运行时添加新的属性和方法,以便该对象可以被期望添加的元素存在的方法/代码使用.

0__*_*0__ 7

Scala 2.9将具有特殊处理的动态特性,可能正是您所寻找的.

这个博客有一个很大的关于它:http://squirrelsewer.blogspot.com/2011/02/scalas-upcoming-dynamic-capabilities.html

我猜想在invokeDynamic方法中你需要检查"name_ =","speak_ =","name"和"speak",你可以将值存储在私有地图中.