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
我有一个 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