1

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

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?
4

1 回答 1

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]

在这种情况下,两者A都有B一个实例方法:foo在他们自己的级别,所以他们都会:foo在他们实现的实例方法列表中返回。

我相信您认为错误地出现在此列表中的大多数方法在两者中Float以及在Numeric不同的实现中都以类似的方式实现。可能是为了处理两个或两个操作数都是 a 的情况Float

于 2013-08-06T00:25:38.223 回答