我对 Ruby 的了解是,私有方法甚至不能用显式接收者来调用self。
class Private
private
def private_method(c)
puts '#{c}'
end
end
p = Private.new
p.instance_eval{ private_method("private method called") }
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?我们可以使用 来调用私有方法instance_eval。请解释
Ruby 允许您做很多破坏封装或任何其他原则的“令人讨厌”的事情。
instance_evalself用being运行该块p。当您在实例中时,您显然可以调用私有方法。您甚至可以这样定义方法!
class A
end
a = A.new
a.instance_eval{def value; 5; end}
puts a.value # prints "5"
Run Code Online (Sandbox Code Playgroud)
这不是您可以执行此操作的唯一方法。send也允许调用私有方法:
class A
private
def p
5
end
end
a = A.new
puts a.send(:p) # prints "5"
Run Code Online (Sandbox Code Playgroud)