2013-08-06 3 views
1

Выполнение этого кода печатает два списка методов, которые не имеют одинакового размера. Почему это?Почему методы instance_methods (false) возвращают методы предков?

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 

не запрашивающий нет методов предка:

% 
* 
** 
+ 
- 
[email protected] 
/
< 
<= 
<=> 
== 
=== 
> 
>= 
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? 

ответ

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 в их списке реализованных методов экземпляра.

Я считаю, что большинство методов, которые, по вашему мнению, ошибочно появились в этом списке, аналогичным образом реализованы как в Float, так и в Numeric с различными вариантами реализации. Вероятно, обрабатывать случай, когда или оба из операндов являются Float.

Смежные вопросы