2013-03-26 11 views
12

Deleguję kilka metod, a także chcę, aby wszystkie były prywatne.Twórz metody delegowane prywatne

class Walrus 
    delegate :+, :to => :bubbles 

    def bubbles 
    0 
    end 
end 

mogę powiedzieć private :+, ale muszę to zrobić dla każdej metody. Czy istnieje sposób, aby zwrócić listę delegowanych metod lub zlecić tworzenie prywatnych metod?

+0

Ta część nie jest jasna: "Mogłabym powiedzieć, prywatna: +, ale każda metoda, którą deleguję, musi być natychmiastowo jawnie ustalona". Dlaczego? – sawa

+0

Jeśli chcę delegować 10 metod i mieć je wszystkie jako prywatne, musiałbym to zrobić: delegate: method_1,: method_2,: method_3,: method_4,: method_5,: method_6,: method_7,: method_8,: method_9 ,: method_10,: to =>: bubbles' then 'private: method_1,: method_2,: method_3,: method_4,: method_5,: method_6,: method_7,: method_8,: method_9,: method_10' – Chris

+0

Następnie, w jaki sposób napisał był mylący. – sawa

Odpowiedz

5

Monkey łata Module dodać metodę pomocniczą, podobnie jak to, co robi ActionSupport paczka:

class Module 
    def private_delegate *methods 
    self.delegate *methods 
    methods.each do |m| 
     unless m.is_a? Hash 
     private(m) 
     end 
    end 
    end 
end 

# then 
class Walrus 
    private_delegate :+, :to => :bubbles 

    def bubbles 
    0 
    end 
end 
35

Ponieważ delegate zwraca listę symboli przekazywanych w możesz łańcuch metoda wywołuje tak:

private *delegate(:foo, :bar, :to => :baz) 
+7

Brak mocy monkeypatching i splat. Ten gość zasługuje na medal. –

+1

daj temu człowiekowi ciasteczko! – equivalent8