【问题标题】:Is there a method_missing in scala?scala中是否有method_missing?
【发布时间】:2011-03-07 13:02:17
【问题描述】:

类似于 Ruby 中的那个

【问题讨论】:

  • 这个问题甚至没有意义。如果你有一个实际问题,你应该问如何解决它,而不是问如何实施你认为的解决方案。
  • Scala 2.9 中有一个 method_missing 等价物,请参阅下面的答案。

标签: scala method-missing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    对于 [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 :-)

    【讨论】:

    • 虽然结构类型是使用反射实现的,但它在编译时会像类一样被静态检查。
    • 当然,这不再是真的——这个答案应该是不被接受的
    • @oxbow_lakes 感谢您指出它不再 [完全] 正确并让我更新我的答案以反映。
    【解决方案3】:

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

    您可以在 Scala 中以几种方式模仿 method_missing,尤其是使用 Actors 库,但它与 Ruby 的 method_missing 并不完全相同(或几乎一样简单)。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 使用最新版本的 Scala 实际上是可能的
      猜你喜欢
      • 2011-02-11
      • 2012-04-04
      • 2011-02-21
      • 2013-11-15
      • 2011-04-04
      • 2011-11-30
      相关资源
      最近更新 更多