首先,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