我有一个包含许多静态方法的类。每个人都必须调用一个通用方法,但我尽量不公开后一种方法。将其设为私有(private)只允许从该类的自己的实例进行访问? 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
它定义了方法foo
在显式对象上,self
,在该范围内返回包含类 Bar
.
是的,它可以定义为一个类方法,但是static 在 Ruby 中并没有真正的意义。
然后 private
不会起作用,因为在显式对象(例如 def self.foo
)上定义方法会绕过访问限定符并使该方法公开。
您可以做的是使用 class << self
打开包含类的元类,并将其中的方法定义为实例方法的语法:
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)方法的静态方法的 Ruby 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29737435/