5

类似于 Ruby 中的那个

4

4 回答 4

12

的,从带有选项的 Scala 2.9 开始-Xexperimental,可以使用Dynamictrait ( scaladoc )。扩展的类Dynamic获得了神奇的方法applyDynamic(methodName, args),其行为类似于 Ruby 的method_missing.

除其他外,该Dynamic特征可用于与 JVM 上的动态语言交互。

于 2011-06-25T20:11:54.370 回答
9

Dynamic对于[experimental] Scala 2.9 中的特征,以下内容不再严格正确。例如,请参阅 Kipton Barros 的答案。

然而,Dynamic它仍然不是很像method_missing,而是使用编译器魔术来有效地将方法调用重写为静态确定的“缺失”方法,到代理 ( applyDynamic)。与多态观点不同的是静态确定“缺失”方法的方法method_missing:需要尝试动态转发(例如使用反射)方法以获得真实method_missing行为。(当然这可以通过避免子类型来避免:-)


不,这样的概念在 Java 或 Scala 中不存在。

与 Java 一样,Scala 中的所有方法在编译时都是“绑定”的(这也决定了使用什么方法进行重载等)。如果程序确实编译,则该方法存在(或根据编译器执行),否则不存在。这就是为什么如果您更改类定义而不重建所有受影响的类,您可以获得NoSuchMethodError的原因。

如果您只是担心尝试在符合签名的对象上调用方法(“类型化的鸭子类型”),那么也许您可以摆脱结构类型。Scala 中的结构类型是对反射的神奇访问——因此它将“绑定”推迟到运行时,并且可能会生成运行时错误。与 method_missing 不同,这不允许目标处理错误,但它确实允许调用者(并且调用者理论上可以在目标上调用定义的 methodMissing 方法......但这可能不是接近 Scala 的最佳方法。Scala不是红宝石:-)

于 2010-06-23T21:20:02.893 回答
6

并不真地。这没有意义。Scala 是一种静态类型语言,其中方法在编译时绑定;Ruby 是一种动态类型语言,其中消息被传递给对象,并且这些消息在运行时被评估,这允许 Ruby 处理它不直接响应的消息,à la method_missing

method_missing您可以在 Scala 中以几种方式进行模仿,特别是使用 Actors 库,但它与 Ruby 的method_missing.

于 2010-06-23T21:17:52.697 回答
1

不,这在 Scala 2.8 及更早版本中是不可能的。

于 2010-06-23T21:16:11.300 回答