/ / क्यों .is_a होगा? और .class विवादित परिणाम देते हैं? - माणिक

क्यों .is_a होगा? और .class विवादित परिणाम देते हैं? - माणिक

मेरे पास तीन वस्तुएं हैं जो सभी एक ही कक्षा हैं। एक के माध्यम से बनाया गया था Item.new और अन्य दो डेटाबेस (Mongoid) से खींच लिया गया था। मैं इन वस्तुओं में से किसी एक को किसी अन्य विधि में पास कर रहा हूं और उस विधि में उस प्रकार की जांच कर रहा हूं is_a?:

def initialize (item, attrs = nil, options = nil)
super(attrs, options)
raise "invalid item object" unless item.is_a?(Item)

खैर, यह raise हिट हो रहा है। तो मैं रेल कंसोल में कक्षा, is_a और instance_of की जांच करता हूं। मुझे विवादित परिणाम मिल रहे हैं। वे वही क्यों होंगे class लेकिन उनमें से केवल एक ही हो instance_of उस 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

क्या मेरे इनपुट की इस प्रकार की जांच करने का कोई बेहतर तरीका है? एक ही कक्षा में तीन चीजें क्यों नहीं होंगी, वे सभी उस वर्ग के उदाहरण होंगे?

उत्तर:

जवाब के लिए 3 № 1

मैं Mongoid नहीं जानता, लेकिन आमतौर पर, एक डीबी पहुंच मेंलाइब्रेरी, आपको डेटाबेस से वास्तविक ऑब्जेक्ट नहीं मिलता है बल्कि एक प्रॉक्सी ऑब्जेक्ट जो डीबी में संग्रहीत ऑब्जेक्ट के लिए स्टैंड-इन के रूप में कार्य करता है। चूंकि रुबी में एक परिपूर्ण पारदर्शी प्रॉक्सी लागू करने के लिए सुविधाओं की कमी होती है, तो आप कभी-कभी देखेंगे अजीब परिणाम, खासकर जब प्रतिबिंब या ऑब्जेक्ट पहचान के आसपास।


जवाब के लिए 2 № 2

@ केएल -7 टिप्पणी पर प्रेरित होकर, ऐसा होना चाहिए:

class Item; end
class PseudoItem; end

# PseudodItem think it"s an Item:
class << PseudoItem
def inspect
"Item"
end
end

i0 = Item.new
i1 = PseudoItem.new

i0.class         #=> Item (correct!)
i1.class         #=> Item (wrong, due to redefinition of inspect!)

i0.is_a? Item    #=> true
i1.is_a? Item    #=> false, as it is a PseudoItem

जवाब के लिए 0 № 3

हां, वही समस्या यहाँ ...

बदसूरत के साथ समस्या हल (बाईपास):

i0.class.to_s==Item.to_s