我一直在浏览Ruby Koans,我发现about_open_classes.rb koan很有趣。特别是他们修改Integer#even?
方法的最后一个测试。我想玩这个概念,所以我打开了Irb并尝试运行Integer.respond_to?(:even?)
,但令我惊讶的是我弄错了。然后我试了Fixnum.respond_to?(:even?)
并弄错了。我也试过Integer.respond_to?(:respond_to?)
并且得到了真实,当我做2.even?
时我也得到了真实。我不知道发生了什么事。谁能说出我错过的东西?
答案 0 :(得分:9)
Fixnum的实例将respond_to? :even?
,但Fixnum 类本身将不会
>> 3.respond_to? :even?
=> true
>> 3.class
=> Fixnum
>> Fixnum.respond_to? :even?
=> false
>> Fixnum.class
=> Class
您可以通过定义自己的测试类来了解其工作原理:
class Test
def self.a
"a"
end
def b
"b"
end
end
>> Test.respond_to? :a
>> true
>> Test.respond_to? :b
>> false
>> t = Test.new
>> t.respond_to? :a
>> false
>> t.respond_to? :b
>> true