如何从Ruby中的实例方法访问受保护的类方法?

Sea*_*ren 6 ruby methods class protected instance

我一定不知道人们如何在Ruby中做到这一点.

如果'#protected'被取消注释,我们得到:
'what':受保护的方法'zoop'调用Foo:Class(NoMethodError)

有没有更好的方法来处理受保护的类方法?

class Foo
  class << self
    #protected
    def zoop 
      "zoop"
    end
  end
  public
  def what
    "it is '#{self.class.zoop}'"
  end
  protected
end

a = Foo.new
p a.what # => "it is 'zoop'"
Run Code Online (Sandbox Code Playgroud)

我想zoop受保护或私人(没有叫'Foo.zoop'),但到目前为止,我似乎无法找到一种优雅的方式.

Sea*_*ren 2

在与 ruby​​-lang 中的 rue: 和 drbrain: 进行进一步讨论后,发现我通过将实用函数放置在类级别来节省内存的冲动是错误的。

在 Ruby 中,实例方法无论如何都挂在类之外,答案是继续将实用程序函数放置在实例级别作为私有。

总之,只能通过实例方法访问的实用函数:

class Foo
  def what
    "it is '#{zoop}'"
  end
  private
  def zoop
    "zoop"
  end
end

p Foo.new.what # => "it is 'zoop'"
Run Code Online (Sandbox Code Playgroud)

对于需要从实例和类方法调用的实用函数,嵌套模块似乎是一种流行的方法:

class Foo
  module Util
    def self.zoop
      "zoop"
    end
  end
  def what
    "it is '#{Util.zoop}'"
  end
  class << self
    def class_what
      "for all time it is '#{Util.zoop}'"
    end
  end
end

p Foo.new.what   # => "it is 'zoop'"
p Foo.class_what # => "for all time it is 'zoop'"
p Foo::Util.zoop # visible, alas
Run Code Online (Sandbox Code Playgroud)