2009-06-15 21 views
8

रूबी तो जैसे एक संरक्षित/निजी ब्लॉक परिभाषित करने के लिए एक सुविधा है प्रतीत नहीं होता:रूबी में निजी/संरक्षित ब्लॉक?

protected do 
    def method 
    end 
end 

यह

protected 

def method 
end 

public 

जहां के बाद "सार्वजनिक" भूल भी सकते हैं की तुलना में अच्छा होगा संरक्षित तरीकों।

मेटाप्रोग्रामिंग का उपयोग करके इसे लागू करना संभव लगता है। कोई विचार कैसे?

उत्तर

15

चूंकि आप कार्यक्षमता से समूह करना चाहते हैं, इसलिए आप अपने सभी तरीकों की घोषणा कर सकते हैं, और फिर यह पुष्टि कर सकते हैं कि कौन से तरीके सुरक्षित हैं और सुरक्षित हैं जिनका उपयोग आप संरक्षित करना चाहते हैं, और निजी के लिए समान हैं।

निम्न वर्ग दिखाता है कि मेरा क्या मतलब है। इस वर्ग में bar_protected और bar_private को छोड़कर सभी विधियां सार्वजनिक हैं जिन्हें अंत में संरक्षित और निजी घोषित किया जाता है।

class Foo 

    def bar_public 
    print "This is public" 
    end 

    def bar_protected 
    print "This is protected" 
    end 

    def bar_private 
    print "This is private" 
    end 

    def call_protected 
    bar_protected 
    end 

    def call_private 
    bar_private 
    end 

    protected :bar_protected 

    private :bar_private 

end 
+0

मैं यह स्वीकार करते हैं करने का निर्णय लिया उत्तर के रूप में, इस प्रकार रूबी को परिभाषित किया गया है। मैं मान रहा था कि एक संरक्षित ब्लॉक मेटाप्रोग्रामिंग आसान होना चाहिए, लेकिन स्पष्ट रूप से, यह नहीं है। और, मेट्रोग्रामिंग नहीं करना बेहतर है जब तक कि आप परीक्षणों के माध्यम से पुष्टि नहीं कर सकते। फिर भी, समस्या का प्रयास करने के लिए चक को धन्यवाद :) – gsmendoza

+1

निजी और संरक्षित की तरह दिखता है ब्लॉक होना चाहिए। मुझे आश्चर्य है कि वे क्यों नहीं हैं। – mysmallidea

+0

मैं दूसरा क्या @RyanHeneise ने कहा है - क्या कोई इस सम्मेलन पर कुछ और जानकारी प्रदान करने में सक्षम है? – Noz

9

मैं वास्तव में bodnarbm के समाधान का समर्थन और ऐसा करने की सलाह नहीं देते, लेकिन जब से मैं एक metaprogramming चुनौती पारित नहीं हो सकता, यहाँ एक हैक है कि यह पूरा करता रहेगा:

class Module 
    def with_protected 
    alias_if_needed = lambda do |first, second| 
     alias_method first, second if instance_methods.include? second 
    end 
    metaclass = class<<self; self end 
    metaclass.module_eval {|m| alias_if_needed[:__with_protected_old__, :method_added]} 
    def self.method_added(method) 
     protected method 
     send :__with_protected_old__ if respond_to? :__with_protected_old__ 
    end 
    yield 
    metaclass.module_eval do |m| 
     remove_method :method_added 
     alias_if_needed[:method_added, :__with_protected_old__] 
    end 
    end 
end 
+0

धन्यवाद! मैं इसे आज़माउंगा :) – gsmendoza

+0

omg !!! 1 !! 11ONE! – rogi

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