我可以暂时让所有 Ruby 个方法 public 吗?

Can I temporarily make all Ruby methods public?

我在 Rails 控制台中重现了一个错误。我对一些方法感兴趣return,但其中一些方法是私有的,所以在我的控制台中我必须写:

> my_object.my_method
NoMethodError (private method `my_method' called for #<MyClass:0x0123456789ABCDEF>)
> my_object.send(:my_method)

一段时间后这会变得有点乏味,尤其是因为如果不深入了解它们在其中定义的 class 就不清楚哪些是私有的。

有什么方法可以暂时让所有方法public?我不打算在生产中使用它,只是在调试时暂时在我的本地控制台中使用它。

更新:当我说“所有方法”时,我不只是指 my_object 上的方法。我的意思是所有方法 每个对象

类似

my_object.class.private_instance_methods.each { |m| my_object.class.send :public, m }

我想可能会帮你拍一条腿。 :)(但上面的答案更好)

要制作所有方法 public,这应该有效:

ObjectSpace.each_object(Module) do |m|
  m.send(:public, *m.private_instance_methods(false))
end

ObjectSpace.each_object traverses all modules (that includes classes and singleton classes) and makes their (own) private_instance_methods public.


要只制作一个对象 public,您可以使用:

my_object.singleton_class.send(:public, *my_object.private_methods)

通过更改单例 class,只有 my_object 实例受到影响。

请注意,默认情况下,private_methods returns 也继承了方法,包括许多来自 Kernel 的方法。您可能希望传递 false 以仅包含对象自己的私有方法。