scala中有method_missing吗?

时间:2010-06-23 21:11:32

标签: scala method-missing

类似于Ruby中的那个

4 个答案:

答案 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及更早版本中是不可能的。