2009-01-07 11 views
13

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

class Foo 
    def initialize(n) 
    @n = n 
    end 
    private # or protected? 
    def plus(n) 
    @n += n 
    end 
end 

class Foo 
    def Foo.bar(my_instance, n) 
    my_instance.plus(n) 
    end 
end 

a = Foo.new(5) 
a.plus(3) # This should not be allowed, but 
Foo.bar(a, 3) # I want to allow this 

क्षमा करें अगर यह एक सुंदर प्राथमिक प्रश्न है, लेकिन मैं Google को समाधान के लिए अपना रास्ता नहीं दे पाया।

+0

आप अपने प्रश्न ठीक करना चाहिए, तो आप एक टाइपो है। क्या बार या प्लस नामक विधियां हैं? – Samuel

+0

आप सही हैं - ठीक हो जाएगा। धन्यवाद। – user4812

उत्तर

17

निजी या संरक्षित का उपयोग वास्तव में रूबी में इतना नहीं करते हैं। आप किसी ऑब्जेक्ट पर भेज सकते हैं और उसके पास किसी भी विधि का उपयोग कर सकते हैं।

class Foo 
    def Foo.bar(my_instance, n) 
    my_instance.send(:plus, n) 
    end 
end 
9

आप यह कर सकते के रूप में शमूएल से पता चला है, लेकिन यह वास्तव में OO जांच छोड़ते हुए है ...

रूबी में आप केवल एक ही की वस्तुओं के लिए केवल एक ही वस्तु पर निजी तरीकों भेजने के लिए और संरक्षित कर सकते हैं कक्षा। स्टेटिक विधियां मेटा वर्ग में रहती हैं, इसलिए वे एक अलग वस्तु (और एक अलग वर्ग) में हैं - इसलिए आप ऐसा नहीं कर सकते क्योंकि आप निजी या संरक्षित का उपयोग करना चाहते हैं।

6

तुम भी इस्तेमाल कर सकते हैं instance_eval

class Foo 
    def self.bar(my_instance, n) 
    my_instance.instance_eval { plus(n) } 
    end 
end