Ruby koans:Koan 262 - 这是怎么回事?

Ruby koans: Koan 262 - what is going on here?

一直在研究 Ruby koans,我已经达到 262 个了。我已经按如下方式解决了它:

def test_catching_messages_makes_respond_to_lie
    catcher = AllMessageCatcher.new

    assert_nothing_raised do
      catcher.any_method
    end
    assert_equal false, catcher.respond_to?(:any_method)
  end

...但我不知道这段代码在做什么。我查过 assert_nothing_raised,但文档的解释非常稀疏和深奥。我明白这节课应该教我 respond_to? 'lies'在某些情况下,但是这里是什么情况?

难道:any_method不存在?如果它在 assert_nothing_raised 的块中定义,它是否不存在?简而言之,这段代码到底发生了什么?

谢谢。

编辑

这是 WellBehavedFooCatcher 类:

class WellBehavedFooCatcher
    def method_missing(method_name, *args, &block)
      if method_name.to_s[0,3] == "foo"
        "Foo to you too"
      else
        super(method_name, *args, &block)
      end
    end
  end

assert_nothing_raised 在给定块中没有引发任何内容时断言成功 ;-) 在这种情况下,方法调用成功。

关于即使不存在具有此名称的方法也能成功调用方法:Ruby 有一个特殊方法 method_missing,当原始方法不存在时调用该方法:

class A
  def method_missing(the_id)
    puts "called #{the_id.inspect}"
  end
end

A.new.foo

这给了你一个called :foorespond_to? 调用仅检查对象 是否直接 响应方法调用,因此如果 method_missing 正在响应,它将 return false。

换句话说...

catcher 是 class 的一个实例,它响应调用它的任何方法(通过捕获 method_missing)。

调用 catcher.any_method 明显成功。

然而调用 catcher.respond_to?(:any_method) 显然 returns 错误。

所以捕捉消息会使 respond_to? 撒谎。