2011-11-02 8 views
6

मैं के बारे में कैसे लोग इस रूबी में क्या कुछ कमी की जानी चाहिए।रूबी में उदाहरण विधियों से संरक्षित वर्ग विधियों तक कैसे पहुंचता है?

यदि '#protected' uncommented है हम पाते हैं:
'क्या में: सुरक्षित विधि फू के लिए कहा जाता है' Zoop ': कक्षा (NoMethodError)

वहाँ संरक्षित वर्ग तरीकों से संपर्क करना एक बेहतर तरीका है?

class Foo 
    class << self 
    #protected 
    def zoop 
     "zoop" 
    end 
    end 
    public 
    def what 
    "it is '#{self.class.zoop}'" 
    end 
    protected 
end 

a = Foo.new 
p a.what # => "it is 'zoop'" 

मैं Zoop चाहते हैं संरक्षित किया जाना या निजी (कोई बुला 'Foo.zoop'), लेकिन अभी तक, मैं एक सुंदर रास्ता खोजने नहीं कर पा रहे।

+0

वहाँ एक अंतर्निहित धारणा है कि एक वर्ग के उदाहरण के अलावा अन्य वस्तुओं है वर्ग के सिंगलटन तरीकों को अधिक घनिष्ठ पहुंच होनी चाहिए है? वास्तव में –

+0

। और अच्छी तरह से कहा। –

उत्तर

2

रुए के साथ आगे विचार-विमर्श करने पर: और DrBrain: माणिक लैंग में, यह पता चला है कि मेरे आवेग से स्मृति को बचाने के लिए कक्षा स्तर पर उपयोगिता कार्यों को खो दिया गया था।

रूबी में, उदाहरण के तरीकों वर्ग बंद लटका वैसे भी, और जवाब आगे जाना है और निजी के रूप में उदाहरण के स्तर पर उपयोगिता कार्यों जगह है।

सारांश में, एक उपयोगिता समारोह है कि केवल उदाहरण तरीकों से एक्सेस किया जाता है:

class Foo 
    def what 
    "it is '#{zoop}'" 
    end 
    private 
    def zoop 
    "zoop" 
    end 
end 

p Foo.new.what # => "it is 'zoop'" 

एक उपयोगिता समारोह है कि उदाहरण और वर्ग तरीकों से कॉल किया जाना चाहिए के लिए, एक नेस्टेड मॉड्यूल एक लोकप्रिय तरीका लग रहा था:

class Foo 
    module Util 
    def self.zoop 
     "zoop" 
    end 
    end 
    def what 
    "it is '#{Util.zoop}'" 
    end 
    class << self 
    def class_what 
     "for all time it is '#{Util.zoop}'" 
    end 
    end 
end 

p Foo.new.what # => "it is 'zoop'" 
p Foo.class_what # => "for all time it is 'zoop'" 
p Foo::Util.zoop # visible, alas 
2

यह मुश्किल से, तरीकों निजी या रूबी में संरक्षित करने के लिए मायने रखती है क्योंकि तुम सिर्फ कॉल भेज सकते हैं() उनके आसपास पाने के लिए।

आप संरक्षित उपयोग भेजने() इस तरह रहने के लिए Zoop चाहते हैं:

def what 
    "it is '#{self.class.send(:zoop)}'" 
end 
संबंधित मुद्दे