2011-06-15 9 views
11

कहें कि मेरे पास पोस्ट नामक एक कक्षा है जिसमें कई आरंभिक उदाहरण हैं (यानी Post.new(:name => 'foo'))।रूबी में कक्षा के उदाहरण कैसे प्राप्त करें?

क्या उस वर्ग के सभी उदाहरणों को कुछ कहकर पुनर्प्राप्त करने का कोई तरीका है? मैं Post.instances.all

विचारों के साथ कुछ ढूंढ रहा हूं?

धन्यवाद!

+1

आप शायद संदर्भ की एक सूची मैन्युअल रूप से है कि आप निर्माता से अद्यतन संग्रहीत कर सकती है ... लेकिन मैं उत्सुक हूँ तुम क्यों कि ऐसा करने के लिए की आवश्यकता होगी? – Locksfree

उत्तर

18

दृष्टांत दोनों alphazero की और PreciousBodilyFluids जवाब:

class Foo 
    @@instance_collector = [] 
    def initialize 
    @@instance_collector << self 
    #other stuff 
    end 
    def self.all_offspring 
    @@instance_collector 
    end 
end 

a = Foo.new 
b = Foo.new 

p Foo.all_offspring # => [#<Foo:0x886d67c>, #<Foo:0x886d668>] 
p ObjectSpace.each_object(Foo).to_a # => [#<Foo:0x886d668>, #<Foo:0x886d67c>] #order is different 
+0

यदि कोई उदाहरण नष्ट हो गया है, तो क्या यह '@@ instance_collector' अपडेट हो जाएगा। – Vijay

+0

@ विजय संक्षिप्त उत्तर नहीं है, क्योंकि सरणी से ऑब्जेक्ट को हटाने वाला कोई LOC नहीं है। – onebree

7

नया ओवरराइड; गिनती रखें; संपत्ति का पर्दाफाश करें।

+0

+1 लघु, मीठा, टू-द-पॉइंट। –

21

आप ObjectSpace उपयोग कर सकते हैं किसी वर्ग के सभी instantiated वस्तुओं को पुनः प्राप्त करने:

posts = [] 
ObjectSpace.each_object Post do |post| 
    posts << post 
end 

यह लगभग निश्चित रूप से एक बुरा विचार है, हालांकि है - उदाहरण के लिए, यह भी पोस्ट उदाहरणों से स्मृति में अभी भी लोड होगा पहले के अनुरोध जो कचरे से एकत्र नहीं हुए हैं। जिन पदों की आप परवाह करते हैं उन्हें पाने के लिए शायद एक बेहतर तरीका है, लेकिन आप जो भी करने की कोशिश कर रहे हैं उसके बारे में हमें और जानकारी चाहिए।

संबंधित मुद्दे