小智 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 :-)
并不是的.这没有意义.Scala是一种静态类型语言,其中方法在编译时受到约束; Ruby是一种动态类型语言,其中消息被传递给对象,并且这些消息在运行时被评估,这允许Ruby处理它不直接响应的消息,例如method_missing.
您可以method_missing在Scala中以某种方式模仿,特别是通过使用Actors库,但它与Ruby的不完全相同(或几乎一样容易)method_missing.
| 归档时间: |
|
| 查看次数: |
1649 次 |
| 最近记录: |