2010-01-31 9 views
5

में इंस्टेंस विधियों को निजी बनाएं, किसी अन्य ऑब्जेक्ट में उस ऑब्जेक्ट को पंजीकृत करने के बाद मुझे कुछ इंस्टेंस विधियों को निजी बनाने की आवश्यकता है।रनटाइम

मैं ऑब्जेक्ट को फ्रीज नहीं करना चाहता क्योंकि यह केवल कम कार्यक्षमता के साथ संपादन योग्य रहना चाहिए। और मैं तरीकों को अनदेखा नहीं करना चाहता क्योंकि इन्हें आंतरिक रूप से उपयोग किया जाता है।

class MyClass 

    def my_method 
    puts "Hello" 
    end 

end 

a = MyClass.new 
b = MyClass.new 

a.my_method       #=> "Hello" 
a.private_instance_method(:my_method) 
a.my_method       #=> NoMethodError 
b.my_method       #=> "Hello" 

कोई भी विचार:

कुछ की तरह मैं क्या जरूरत है?

उत्तर

4

क्या सार्वजनिक है और क्या निजी है है प्रति वर्ग। लेकिन प्रत्येक ऑब्जेक्ट का अपना वर्ग हो सकता है:

class Foo 

    private 

    def private_except_to_bar 
    puts "foo" 
    end 

end 

class Bar 

    def initialize(foo) 
    @foo = foo.dup 
    class << @foo 
     public :private_except_to_bar 
    end 
    @foo.private_except_to_bar 
    end 

end 

foo = Foo.new 
Bar.new(foo) # => "foo" 

foo.private_except_to_bar 
# => private method `private_except_to_bar' called for #<Foo:0xb7b7e550> (NoMethodError) 

लेकिन यक। इन विकल्पों पर विचार करें:

  • बस विधि को सार्वजनिक बनाएं।
  • वैकल्पिक डिजाइनों का अन्वेषण करें।
+0

यह मेरे संदेह का उत्तर देता है: "सार्वजनिक क्या है और प्रति वर्ग निजी क्या है।"। मुझे लगता है कि मुझे अन्य विकल्पों का पता लगाना है। –

8

आप पर विधि नाम कभी भी विधि private कॉल कर सकते हैं यह निजी बनाने के लिए:

>> class A 
>> def m 
>> puts 'hello' 
>> end 
>> end 
=> nil 
>> a = A.new 
=> #<A:0x527e90> 
>> a.m 
hello 
=> nil 
>> class A 
>> private :m 
>> end 
=> A 
>> a.m 
NoMethodError: private method `m' called for #<A:0x527e90> 
    from (irb):227 
    from /usr/local/bin/irb19:12:in `<main>' 

या, वर्ग बाहर से:

A.send :private, :m 
+0

इससे विधि उस वर्ग की सभी वस्तुओं के लिए निजी होगी और न केवल एक। –

5
class A 
    def test 
    puts "test" 
    end 
    def test2 
    test 
    end 
end 

a = A.new 

class << a 
    private :test 
end 

a.test2 # works 
a.test # error: private method