类似于Ruby中的那个
答案 0 :(得分:12)
是,对于带有-Xexperimental
选项的Scala 2.9,可以使用Dynamic
特征
(scaladoc)。扩展Dynamic
的类获得了类似于Ruby applyDynamic(methodName, args)
的神奇方法method_missing
。
除其他事项外,Dynamic
特征对于与JVM上的动态语言进行交互非常有用。
答案 1 :(得分:9)
在[实验] Scala 2.9中找到的Dynamic
特征不再严格如此。例如,请参阅Kipton Barros的答案。
然而,Dynamic
仍然不完全,如method_missing
,而是使用编译器魔术来有效地重写方法调用“缺失”方法,如静态确定的那样,代理(applyDynamic
)。这是静态确定“缺失”方法的方法,它将它与method_missing
从多态性观点区分开来:需要尝试和动态转发(例如使用反射)方法来获取真method_missing
行为。 (当然,通过避免子类型可以避免这种情况: - )
否。 Java或Scala中不存在这样的概念。
与Java一样,Scala中的所有方法在编译时都是“绑定”的(这也决定了用于重载的方法等)。如果程序编译,则表示存在(或根据编译器执行),否则不存在。这就是为什么如果更改类定义而不重建所有受影响的类,则可以获得NoSuchMethodError。
如果您只是担心尝试在符合签名的对象上调用方法(“打字鸭子打字”),那么也许您可以逃脱structural typing。 Scala中的结构类型是对反射的神奇访问 - 因此它将“绑定”推迟到运行时,并且可能会生成运行时错误。与method_missing不同,这不允许目标处理错误,但它确实允许调用者(并且调用者理论上可以在目标上调用已定义的methodMissing方法...但这可能不是接近Scala的最佳方式.Scala不是Ruby: - )
答案 2 :(得分:6)
不是真的。这没有意义。 Scala是一种静态类型语言,其中方法在编译时受到约束; Ruby是一种动态类型语言,其中消息被传递给对象,并且这些消息在运行时被评估,这允许Ruby处理它不直接响应的消息,àla{{1 }}
你可以在Scala中以某种方式模仿method_missing
,特别是通过使用Actors库,但它与Ruby的method_missing
不完全相同(或几乎一样容易)。
答案 3 :(得分:1)
不,这在Scala 2.8及更早版本中是不可能的。