我对Ruby的了解是,使用显式接收器即使self
也无法调用私有方法。
class Private
private
def private_method(c)
puts '#{c}'
end
end
p = Private.new
p.instance_eval{ private_method("private method called") }
这是如何工作的?我们可以使用instance_eval
调用私有方法。请解释
答案 0 :(得分:1)
因为instance_eval
在p
的上下文中执行了块(意思是self
),现在对private_method
的调用是一个带隐式接收器的调用。 / p>
答案 1 :(得分:1)
Ruby允许你做很多破坏封装或其他原则的“讨厌”事情。
instance_eval
在self
为p
的情况下运行该块。当你在实例中时,显然可以调用私有方法。你甚至可以用这种方式定义方法!
class A
end
a = A.new
a.instance_eval{def value; 5; end}
puts a.value # prints "5"
这不是你能做到这一点的唯一方法。 send
也可以调用私有方法:
class A
private
def p
5
end
end
a = A.new
puts a.send(:p) # prints "5"