【问题标题】:Which is correct REPL or command-line?哪个是正确的 REPL 或命令行?
【发布时间】:2020-03-04 00:41:22
【问题描述】:

当我在 Object 类中编写缺少方法时,我在每个接口中得到不同的输出。

代码是

class Object
  def method_missing(hgh)
    puts self
  end
end

当我像 irb 一样使用 REPL 时,我得到了

当我使用命令行时,我没有收到任何错误,任何原因都会有所帮助,在此先感谢

【问题讨论】:

    标签: ruby read-eval-print-loop irb method-missing


    【解决方案1】:

    tl;dr 的答案是两者都是正确的。 REPL 中发生了更多事情。


    当你从命令行运行代码时:

    ruby script.rb
    

    所发生的一切都是它被e估价。

    而像 IRB 这样的 REPL r阅读您的输入,e对其进行评估并p将其放入 l哎呀。

    在这种情况下,e评估您的代码实际上破坏了 REPL,并导致随后的 print 失败。


    现在您可能对此有些困惑。 “两种情况下都有打印,我使用puts!”。我在这里指的印刷品是在每次 e 估值后可视化的结果。本例为方法定义结果(=> :method_missing)。


    它可能不仅仅是 printing 本身。它可能是 REPL 必须执行的大量其他底层代码以保持状态,如 “在哪一行定义了什么代码” 等等。

    想想你刚刚做了什么——你做到了,每个对象都有每个方法可以返回nil。这不仅仅适用于您在 REPL in 中编写的代码。它也适用于 REPL 本身的代码。

    【讨论】:

    • 这个。 REPL 是一段复杂的 Ruby 代码,而 OP 只是从根本上修改了系统中每个对象的行为方式。如果这没有破坏某些东西,那将是非常令人惊讶的。
    • @ndnenkov 在这种情况下,在那里写“method_missing”方法有什么问题。如果那是任何其他新方法,它不会抛出任何错误。我能知道为什么这段代码的行为很奇怪吗!
    • @RamireddySamar method_missing 是 Ruby 中的一种特殊方法,如果您尝试调用不存在的对象上的方法,则会调用该方法。前任。 4.foo 将调用 4.method_missing :foo,因为 4 没有 foo 方法。所以从某种意义上说,你刚刚做到了4foo (以及任何其他方法)。这就是 method_missing 与其他方法名称相比的特别之处。
    • @ndnenkov 看起来,只有当我在 method_missing 即 puts self 中有任何代码时,我才会收到此错误,如果它不包含类似 method_missing(met) do end 的内容,那么我没有收到任何错误,什么关于这个?
    • @RamireddySamar 你可以试试这个:def method_missing(hgh); puts self; super; end 而不是你当前的实现吗? (也就是在末尾添加一个super)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2018-03-23
    • 2013-01-31
    • 2020-03-31
    • 2013-05-30
    • 2018-10-19
    相关资源
    最近更新 更多