2013-03-06 4 views
2

an answer to a previous question에서 언급했듯이 B < A은 클래스가 다른 클래스의 하위 클래스인지 여부를 쉽게 판단 할 수있는 방법입니다. 그러나 이것은 B이 싱글 톤 클래스 (즉, 고유 클래스) 일 때 루비 1.8 (또한 REE 1.8)에서 실패한 것으로 보인다. 설명하기 :Ruby 1.8 vs. 1.9 : Ruby 싱글 톤 클래스가 다른 클래스의 서브 클래스인지 확인

class A; end 
class B < A; end 

b = B.new 

B.ancestors       # => [B, A, Object, Kernel] (also BasicObject in 1.9) 
(class << b; self; end).ancestors # => [B, A, Object, Kernel] (also BasicObject in 1.9) 

B < A        # => true 
(class << b; self; end) < A   # => true in 1.9; false in 1.8 

당신이 볼 수 있듯이, A는 싱글 톤 클래스 (class << b; self; end)의 조상으로 표시하더라도, 그것은 당신이 루비 1.8 A 자사의 여부 서브 클래스를 확인할 때 false가 (그러나 제대로 돌려줍니다 1.37에서 true).

B.superclass 
    # => A 

(class << b; self; end).superclass 
    # => B in 1.9 
    # => singleton class of B in 1.8 

(class << b; self; end).superclass.superclass 
    # => A in 1.9 
    # => singleton class of Class in 1.8 

는 사람이 1.9으로 고정 혹은 의도적 1.9에서 변경된 동작을 예상 할 수있는 일이 1.8의 버그인지 알고 있나요 다음 #superclass 체인이 경우 이유를 보여 나타납니다 다음? 다른 곳에서이 문제에 대한 언급이나 문서를 찾으려고했지만 아무 것도 찾을 수 없었습니다.

그리고이 문제로 인해 누구나 을 알 수 있습니까? 싱글 톤 클래스가 Ruby 1.8의 서브 클래스 A인지 확인하는 가장 좋은 방법은 무엇입니까? 조상 목록에 포함 된 모듈이 포함되어 있기 때문에 기술적으로 "올바르지"않더라도 해결 방법으로 (class << b; self; end).ancestors.include?(A)을 수행했습니다.

답변

1

내가 제안 :

class Object; def metaclass; class << self; self; end; end; end 

class A; end 
class B < A; end 

b = B.new 

b.metaclass < A.metaclass || b.metaclass < A 

루비 1.8, 1.9, 2.0에서 테스트.