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

난 당신이 계정 대체 방법을 고려하지 않는 것 같아요. 이 경우 두 AB에서

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] 

자신의 수준에서 인스턴스 메서드 :foo을 가지고, 그래서 그들은 모두 구현 인스턴스 메소드의 자신의 목록에 :foo을 반환합니다.

나는이 목록에 잘못 나타난 것으로 생각되는 대부분의 방법이 다양한 구현과 함께 FloatNumeric에서 비슷하게 구현됩니다. 아마도 피연산자 중 하나 또는 모두가 Float 인 경우를 처리 할 수 ​​있습니다.

관련 문제