2012-02-06 11 views
6

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

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

खैर, यह बढ़ाने हिट हो रही है। तो मैं रेल कंसोल में कक्षा, 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 

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

+0

* क्या वे एक ही कक्षा हैं? उदाहरण के लिए, एआर संघों ने ऐरे होने का दावा किया है, लेकिन वे नहीं हैं। –

+1

क्या आप अन्य वस्तुओं के लिए 'i0.class.object_id' के आउटपुट जोड़ सकते हैं? हो सकता है कि कक्षाओं के पुनः लोडिंग के साथ कुछ करना हो और आपको उसी वर्ग के दो अलग-अलग उदाहरण मिलें। –

+0

@ डेव न्यूटन ठीक है, क्या कक्षा और is_a प्रकार की सामग्री की जांच करने का एक बेहतर तरीका है? – jcollum

उत्तर

3

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

2

@ KL-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

हां, एक ही समस्या यहाँ ...

समस्या हल हो गई बदसूरत बजे से (नजरअंदाज):

i0.class.to_s==Item.to_s 
संबंधित मुद्दे