运行此代码会打印两个大小不同的方法列表。那是为什么?
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?
答案 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]
在这种情况下,A
和B
都有自己级别的实例方法:foo
,因此它们都会在其实现的实例方法列表中返回:foo
。
我相信您认为错误地出现在此列表中的大部分方法都在Float
和Numeric
中同样实现,具有不同的实现。可能处理其中或两个操作数都是Float
的情况。