Ruby class 用静态方法调用私有方法?

Ruby class with static method calling a private method?

我有一个 class 有很多静态方法。每个人都必须调用一个通用方法,但我尽量不公开后一种方法。将其设为私有将只允许从 class? Protected 好像也解决不了这里的问题

如何在静态上下文中隐藏 do_calc 不被外部调用? (让它可以从前两个静态方法调用。)

class Foo
  def self.bar
    do_calc()
  end
  def self.baz
    do_calc()
  end
  def self.do_calc
  end
end

首先,static 并不是 Ruby 行话 的一部分。

举个简单的例子:

class Bar
  def self.foo
  end
end

它在显式对象 self 上定义方法 foo,在该范围内 returns 包含 class Bar。 是的,它可以定义一个class方法,但是static在Ruby.

那么 private 将不起作用,因为在显式对象上定义方法(例如 def self.foo)会绕过访问限定符并使方法 public.

你可以做的是使用 class << self 语法 打开包含 class 的 metaclass,然后定义那里的方法作为实例方法:

class Foo
  class << self

    def bar
      do_calc
    end

    def baz
      do_calc
    end

    private

    def do_calc
      puts "calculating..."
    end
  end
end

这将为您提供所需的信息:

Foo.bar
calculating...

Foo.baz
calculating...

Foo.do_calc
NoMethodError: private method `do_calc' called for Foo:Class

您可以使用 private_class_method 定义私有 class 方法,如下所示:

class Foo
  def self.bar
    do_calc
  end

  def self.baz
    do_calc
  end

  def self.do_calc
    #...
  end
  private_class_method :do_calc
end

或从 Ruby 2.1 开始:

class Foo
  def self.bar
    do_calc
  end

  private_class_method def self.do_calc
    #...
  end
end