17

我委托了几种方法,并且还希望它们都是私有的。

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

  def bubbles
    0
  end
end

我可以说private :+,但我必须对每种方法都这样做。有没有办法返回委托方法列表或让委托创建私有方法?

4

3 回答 3

59

因为delegate返回传入的符号列表,您可以像这样链接方法调用:

private *delegate(:foo, :bar, :to => :baz)
于 2016-03-08T02:59:00.497 回答
5

添加一个辅助方法的猴子补丁Module,就像ActionSupportpack 所做的那样:

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
于 2013-03-26T17:35:49.247 回答
3

对于那些使用 Rails 6+ 的人,感谢 Tomas Valent 现在您可以通过 private 选项将委托方法设为私有

delegate :method, to: :object, private: true
于 2019-12-23T13:51:02.517 回答