Tôi có ba đối tượng là tất cả cùng một lớp. Một được tạo ra thông qua Item.new
và hai cái còn lại được lấy từ cơ sở dữ liệu (Mongoid). Tôi đang đi qua một/bất kỳ của các đối tượng này đến một phương pháp và kiểm tra các loại trong phương pháp mà qua is_a?
:tại sao .is_a? và .class cho kết quả mâu thuẫn?
def initialize (item, attrs = nil, options = nil)
super(attrs, options)
raise 'invalid item object' unless item.is_a?(Item)
Vâng, tăng lương này là nhận được nhấn. Vì vậy, tôi kiểm tra lớp, is_a và instance_of trong giao diện điều khiển ray. Tôi nhận được kết quả mâu thuẫn. Tại sao họ có cùng một số class
nhưng chỉ một trong số họ là instance_of
mà class
?
>> i0.is_a? Item
=> false
>> i1.is_a? Item
=> false
>> i2.is_a? Item
=> true
>> i0.class
=> Item
>> i1.class
=> Item
>> i2.class
=> Item
>> i0.instance_of?(Item)
=> false
>> i1.instance_of?(Item)
=> false
>> i2.instance_of?(Item)
=> true
Có cách nào tốt hơn để kiểm tra loại đầu vào của tôi không? Tại sao ba điều đó là cùng một lớp không phải tất cả là trường hợp của lớp đó?
* Họ có cùng lớp không? Ví dụ, các hiệp hội AR tự xưng là Array, nhưng chúng không. –
Bạn có thể thêm đầu ra của 'i0.class.object_id' và tương tự cho các đối tượng khác không? Có thể nó có một cái gì đó để làm với các lớp tải lại và bạn có hai trường hợp khác nhau của cùng một lớp. –
@DaveNewton ok, có cách nào tốt hơn để điều tra một lớp học và loại công cụ is_a? – jcollum