为什么Integer.respond_to?(:even?)返回false?

时间:2013-09-20 13:41:09

标签: ruby

我一直在浏览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?时我也得到了真实。我不知道发生了什么事。谁能说出我错过的东西?

1 个答案:

答案 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