首先,MyClass.send(:my_method)
不起作用。您必须将其发送到实例:MyClass.new.send(:my_method)
。
然后,你的my_class_method
是不是真的私人。
Ruby的语义private
与您在其他语言中可能会使用的有所不同。由于Ruby允许您选择跳过封装,因此private
仅意味着只能在不向实际对象发送消息的情况下隐式调用。
例如:
class Example
def test
'foobar'
end
def hello
puts test # implicit receiver
puts self.test # explicit receiver
end
end
这一切都不错,但为什么是你的问题很重要?
因为您在self
上明确声明my_class_method
。这样做绕过private
修饰符,并且该方法是公开的。这意味着,你可以把它用:
MyClass.my_class_method
如果你真的需要private
类的方法,那么你可以将它们定义在元类:
class MyClass
class << self
private
def my_class_method
puts "class method"
end
end
private
def my_method
puts "regular method"
end
end
这将使my_class_method
实际上私人,并迫使你用以下任何一种方式调用它:
MyClass.send :my_class_method
MyClass.class_exec { my_class_method }
MyClass.class_eval { my_class_method }
MyClass.class_eval "my_class_method"
谢谢你的提示! – Severin