【发布时间】:2011-07-18 23:42:28
【问题描述】:
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"
在 Scala 中,我们能从中得到的最接近的东西是什么?如果有类似“addProperty”的东西允许像普通字段一样使用添加的属性,那就足够了。
我对结构类型声明(“类型安全的鸭子类型”)不感兴趣。我真正需要的是在运行时添加新的属性和方法,以便对象可以被期望添加的元素存在的方法/代码使用。
【问题讨论】:
-
我认为“Topaz 告诉 null”很好地说明了为什么应尽可能避免此类事情。呃,我的意思是,汪汪。
-
我同意。那只是一个例子。在现实世界中,我会使用它从 JSON 或 XML 读取域对象,如果属性不存在,我不希望它失败,也不想编写一些 if 或条件代码。下次我会尝试一个更好的例子。
标签: reflection scala dynamic