我可以暂时让所有 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
以仅包含对象自己的私有方法。
我在 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
以仅包含对象自己的私有方法。