【问题标题】:Make delegated methods private将委托方法设为私有
【发布时间】:2013-03-16 14:36:25
【问题描述】:

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

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

  def bubbles
    0
  end
end

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

【问题讨论】:

  • 这部分不清楚:“我可以说是私有的:+,但是我委托的每个方法都必须立即、明确地设为私有”。这是为什么呢?
  • 如果我想委托 10 个方法并让它们全部私有,我必须这样做:delegate :method_1, :method_2, :method_3, :method_4, :method_5, :method_6, :method_7, :method_8, :method_9, :method_10, :to => :bubbles 然后private :method_1, :method_2, :method_3, :method_4, :method_5, :method_6, :method_7, :method_8, :method_9, :method_10
  • 那么,你写的方式有误导性。

标签: ruby delegates activesupport


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    对于那些使用 Rails 6+ 的用户,感谢 Tomas Valent 现在you can pass the private option to make the delegated methods private

    delegate :method, to: :object, private: true
    

    【讨论】:

    • 我知道这个问题没有被 Rails 标记。
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多