为什么instance_methods(false)返回祖先方法?

时间:2013-08-06 00:16:24

标签: ruby ruby-2.0

运行此代码会打印两个大小不同的方法列表。那是为什么?

puts 'Subtracting ancestor methods:'
puts (Float.instance_methods - Object.instance_methods - Numeric.instance_methods).sort
puts
puts 'Requesting no ancestor methods:'
puts Float.instance_methods(false).sort

减去祖先方法:

*
**
+
-
/
finite?
infinite?
nan?
rationalize
to_f
to_i
to_r

请求没有祖先方法:

%
*
**
+
-
-@
/
<
<=
<=>
==
===
>
>=
abs
angle
arg
ceil
coerce
denominator
divmod
eql?
fdiv
finite?
floor
hash
infinite?
inspect
magnitude
modulo
nan?
numerator
phase
quo
rationalize
round
to_f
to_i
to_int
to_r
to_s
truncate
zero?

1 个答案:

答案 0 :(得分:5)

我认为你没有考虑被覆盖的方法。

class A
  def foo
    'A'
  end

  def bar
    'baz'
  end
end

class B < A
  def foo
    super + 'B'
  end
end

A.instance_methods(false) #=> [:foo, :bar]
B.instance_methods(false) #=> [:foo]

在这种情况下,AB都有自己级别的实例方法:foo,因此它们都会在其实现的实例方法列表中返回:foo

我相信您认为错误地出现在此列表中的大部分方法都在FloatNumeric中同样实现,具有不同的实现。可能处理其中或两个操作数都是Float的情况。