Ruby 中的私有方法调用

mha*_*eeb 5 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") }
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?我们可以使用 来调用私有方法instance_eval。请解释

Ven*_*Ven 6

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)


Ser*_*sev 1

因为在(意思是,它是)instance_eval的上下文中执行块,并且对 now 的调用是带有隐式接收器的调用。pselfprivate_method