Kip*_*ros 12

是的,从Scala 2.9中可以-Xexperimental选择,可以使用Dynamic特征(scaladoc).扩展的类Dynamic获得applyDynamic(methodName, args)行为类似于Ruby的神奇方法method_missing.

除此之外,该Dynamic特征可用于与JVM上的动态语言进行交互.


小智 9

对于Dynamic[实验] Scala 2.9中发现的特征,以下不再严格正确.例如,请参阅Kipton Barros的答案.

但是,Dynamic仍然不太喜欢method_missing,而是采用编译器魔术来有效地重写方法调用"缺失"方法,如静态确定的那样,到proxy(applyDynamic).这是静态确定"缺失"方法的方法,将其与method_missing多态性观点区分开来:人们需要尝试动态转发(例如使用反射)方法来获得真实method_missing行为.(当然这可以通过避免子类型来避免:-)


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

与Java一样,Scala中的所有方法在编译时都是"绑定"的(这也决定了用于重载的方法等).如果程序编译,则表示存在(或根据编译器执行),否则不存在.这就是为什么如果更改类定义而不重建所有受影响的类,则可以获取NoSuchMethodError.

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

  • 虽然结构类型是使用反射实现的,但它在编译时静态检查,就像类一样. (2认同)

mip*_*adi 6

并不是的.这没有意义.Scala是一种静态类型语言,其中方法在编译时受到约束; Ruby是一种动态类型语言,其中消息被传递给对象,并且这些消息在运行时被评估,这允许Ruby处理它不直接响应的消息,例如method_missing.

您可以method_missing在Scala中以某种方式模仿,特别是通过使用Actors库,但它与Ruby的不完全相同(或几乎一样容易)method_missing.