私有方法调用Ruby

时间:2016-09-06 08:42:36

标签: ruby

我对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调用私有方法。请解释

2 个答案:

答案 0 :(得分:1)

因为instance_evalp的上下文中执行了块(意思是self),现在对private_method的调用是一个带隐式接收器的调用。 / p>

答案 1 :(得分:1)

Ruby允许你做很多破坏封装或其他原则的“讨厌”事情。

instance_evalselfp的情况下运行该块。当你在实例中时,显然可以调用私有方法。你甚至可以用这种方式定义方法!

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"