Ruby koans:Koan 262 - 这里发生了什么?

时间:2015-01-06 10:19:29

标签: ruby

一直在使用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,但是文档在他们的解释中非常稀疏和深奥。我明白这一课应该教我回应?在某些情况下“谎言”,但这里的情况是什么?

是不是: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

2 个答案:

答案 0 :(得分:0)

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响应,则返回false。

答案 1 :(得分:0)

换句话说......

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

电话catcher.any_method明显成功。

然而,呼叫catcher.respond_to?(:any_method)显然会返回错误。

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