使用静态方法调用私有方法的Ruby类?

使用静态方法调用私有方法的Ruby类?,ruby,static,encapsulation,Ruby,Static,Encapsulation,我有一个包含许多静态方法的类。每个方法都必须调用一个公共方法,但我尽量不公开后一种方法。将其设置为私有将只允许从类的自身实例进行访问?保护似乎也不能解决这里的问题 如何隐藏do_calc,以免在静态上下文中被外部调用?(让它可以从前两个静态方法调用。) 首先,static并不是Ruby术语的一部分 让我们举一个简单的例子: class Bar def self.foo end end 它在显式对象self上定义方法foo,该对象在该范围内返回包含的类Bar。 是的,它可以定义为一个类方

我有一个包含许多静态方法的类。每个方法都必须调用一个公共方法,但我尽量不公开后一种方法。将其设置为私有将只允许从类的自身实例进行访问?保护似乎也不能解决这里的问题

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


首先,
static
并不是Ruby术语的一部分

让我们举一个简单的例子:

class Bar
  def self.foo
  end
end
它在显式对象
self
上定义方法
foo
,该对象在该范围内返回包含的类
Bar
。 是的,它可以定义为一个类方法,但静态在Ruby中并没有真正的意义

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


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

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

你的问题是什么?为什么
self.bar
调用带括号的方法而
self.baz
不调用?我想这会满足你的要求。而且行话也不是每个人词汇表中的一部分;)
Foo.bar
calculating...

Foo.baz
calculating...

Foo.do_calc
NoMethodError: private method `do_calc' called for Foo: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
class Foo
  def self.bar
    do_calc
  end

  private_class_method def self.do_calc
    #...
  end
end