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 :foo
。 respond_to?
调用仅检查对象 是否直接 响应方法调用,因此如果 method_missing
正在响应,它将 return false。
换句话说...
catcher
是 class 的一个实例,它响应调用它的任何方法(通过捕获 method_missing
)。
调用 catcher.any_method
明显成功。
然而调用 catcher.respond_to?(:any_method)
显然 returns 错误。
所以捕捉消息会使 respond_to?
撒谎。
一直在研究 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 :foo
。 respond_to?
调用仅检查对象 是否直接 响应方法调用,因此如果 method_missing
正在响应,它将 return false。
换句话说...
catcher
是 class 的一个实例,它响应调用它的任何方法(通过捕获 method_missing
)。
调用 catcher.any_method
明显成功。
然而调用 catcher.respond_to?(:any_method)
显然 returns 错误。
所以捕捉消息会使 respond_to?
撒谎。