2010-12-28 23 views
145

Tôi muốn kiểm tra xem một lớp có kế thừa từ một lớp khác hay không, nhưng dường như không tồn tại một phương thức cho lớp đó.Kiểm tra xem lớp Ruby là lớp con của lớp khác

class A 
end 

class B < A 
end 

B.is_a? A 
=> false 

B.superclass == A 
=> true 

Một thực hiện tầm thường của những gì tôi muốn sẽ là:

class Class 
    def is_subclass_of?(clazz) 
    return true if superclass == clazz 
    return false if self == Object 
    superclass.is_subclass_of?(clazz) 
    end 
end 

nhưng tôi sẽ mong đợi điều này để tồn tại.

+1

'A.class # => Class'. Đây là lý do tại sao 'B.is_a? A' trả về false. – Wen

+0

Điều gì về 'loại_of? ' – akostadinov

+1

' kind_of? 'Kiểm tra xem một đối tượng là một _instance_ của một lớp. Không cho dù đối tượng kế thừa từ một lớp. – Confusion

Trả lời

288

Chỉ cần sử dụng < hành

B < A # => true 
A < A # => false 

hoặc sử dụng <= hành

B <= A # => true 
A <= A # => true 
+0

Mẹo hay. Tôi làm như vậy yêu Ruby ... –

+0

Điều này làm việc ... tò mò nếu có ai biết tại sao 'is_a?' Không mặc dù? Cảm ơn! –

+13

@Brian Vì 'is_a? 'Dịch thành * là thể hiện của *. 'B' không phải là một thể hiện của' A', 'B.new' mặc dù (' B.new.is_a? A # => true'). –

47

Cũng có sẵn:

B.ancestors.include? A 

này hơi khác so với (ngắn hơn) câu trả lời của B < AB là inc luded in B.ancestors:

B.ancestors 
#=> [B, A, Object, Kernel, BasicObject] 

B < B 
#=> false 

B.ancestors.include? B 
#=> true 

Có hay không điều này phụ thuộc vào trường hợp sử dụng của bạn.

+21

Dễ đọc hơn: 'B <= B' (cùng kết quả với' B.ancestors.include? B'). –

+0

Cập nhật: Giải pháp ngay trước đó hoạt động với 1,9+ trong khi không có "tổ tiên"? trong 1.9. – Barry

+0

@Barry Tôi không thấy 'tổ tiên? 'Được đề cập trong bất kỳ câu trả lời nào trên trang này, kể cả trang này. Bạn đang đề cập đến cái gì? – Phrogz

Các vấn đề liên quan