【发布时间】:2011-03-07 13:02:17
【问题描述】:
类似于 Ruby 中的那个
【问题讨论】:
-
这个问题甚至没有意义。如果你有一个实际问题,你应该问如何解决它,而不是问如何实施你认为的解决方案。
-
Scala 2.9 中有一个
method_missing等价物,请参阅下面的答案。
标签: scala method-missing
类似于 Ruby 中的那个
【问题讨论】:
method_missing 等价物,请参阅下面的答案。
标签: scala method-missing
是的,从带有-Xexperimental 选项的Scala 2.9 开始,可以使用Dynamic trait
(scaladoc)。扩展 Dynamic 的类获得神奇的方法 applyDynamic(methodName, args),其行为类似于 Ruby 的 method_missing。
除其他外,Dynamic 特征可用于与 JVM 上的动态语言交互。
【讨论】:
对于 [experimental] Scala 2.9 中的 Dynamic 特征,以下内容不再严格正确。例如,请参阅 Kipton Barros 的答案。
但是,Dynamic 仍然不完全像 method_missing,而是使用编译器魔术来有效地将方法调用重写为静态确定的“缺失”方法,代理 (@987654326 @)。从多态性的角度来看,它与method_missing 的区别在于静态确定“缺失”方法的方法:需要尝试动态转发(例如,使用反射)方法来实现@ 987654328@ 行为。 (当然这可以通过避免子类型来避免:-)
没有。 Java 或 Scala 中不存在这样的概念。
像 Java 一样,Scala 中的所有方法在编译时都是“绑定”的(这也决定了使用什么方法进行重载等)。如果程序确实编译,则该方法存在(或根据编译器执行),否则不存在。这就是为什么如果您更改类定义而不重建所有受影响的类,您可以获得NoSuchMethodError。
如果您只是担心尝试在符合签名的对象上调用方法(“类型化的鸭子类型”),那么也许您可以摆脱structural typing。 Scala 中的结构类型是对反射的神奇访问——因此它将“绑定”推迟到运行时,并且可能会生成运行时错误。与 method_missing 不同,这不允许 target 处理错误,但它确实允许调用者(并且调用者理论上可以在目标上调用已定义的 methodMissing 方法......但这可能不是接触 Scala 的最佳方式。Scala 不是 Ruby :-)
【讨论】:
不是真的。这没有意义。 Scala 是一种静态类型语言,其中方法在编译时绑定; Ruby 是一种动态类型语言,其中 messages 被传递给对象,并且这些消息在运行时被评估,这允许 Ruby 处理它不直接响应的消息,à la method_missing .
您可以在 Scala 中以几种方式模仿 method_missing,尤其是使用 Actors 库,但它与 Ruby 的 method_missing 并不完全相同(或几乎一样简单)。
【讨论】:
不,这在 Scala 2.8 及更早版本中是不可能的。
【讨论】: