一直在使用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
答案 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 :foo
。 respond_to?
调用仅检查对象是否直接响应方法调用,因此如果method_missing
响应,则返回false。
答案 1 :(得分:0)
换句话说......
catcher
是一个类的实例,它响应任何调用它的方法(通过捕获method_missing
)。
电话catcher.any_method
明显成功。
然而,呼叫catcher.respond_to?(:any_method)
显然会返回错误。
所以捕捉消息会使respond_to?
撒谎。