2013-03-26 90 views
12

我委託一些方法,並希望他們都是私人的。使委派的方法私人化

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

    def bubbles 
    0 
    end 
end 

我可以說private :+,但我不得不這樣做的每個方法。有沒有辦法返回一個委託方法的列表或委託創建私人方法?

+0

這部分內容並不清楚:「我可以說私密性:+,但那麼我所委託的每種方法都必須立即明確爲私有方式。這是爲什麼? – sawa 2013-03-26 17:25:26

+0

如果我想委託10個方法,並讓它們都是私有的,我將不得不這樣做:'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 2013-03-26 18:18:47

+0

然後,寫的是誤導。 – sawa 2013-03-26 18:40:42

回答

5

猴子補丁Module增加一個輔助方法,就像什麼ActionSupport包做:

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

因爲delegate返回即可鏈傳遞的符號列表的方法調用是這樣的:

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

沒有monkeypatching和摔跤電源。這傢伙值得一枚獎牌。 – 2017-01-03 13:10:38

+1

給那個男人一個餅乾! – equivalent8 2018-02-08 09:56:20