[英]Can I temporarily make all Ruby methods public?
我在 Rails 控制台中重現了一個錯誤。 我對某些方法返回的內容感興趣,但其中一些結果是私有的,所以在我的控制台中我必須寫:
> my_object.my_method
NoMethodError (private method `my_method' called for #<MyClass:0x0123456789ABCDEF>)
> my_object.send(:my_method)
一段時間后這會變得有點乏味,特別是因為如果不深入到定義它們的類,就不清楚哪些是私有的。
有什么辦法可以暫時公開所有方法嗎? 我不打算在生產中使用它,只是在調試時暫時在我的本地控制台中使用它。
更新:當我說“所有方法”時,我不只是指my_object
上的my_object
。 我的意思是每個對象上的所有方法。
要公開所有方法,這應該有效:
ObjectSpace.each_object(Module) do |m|
m.send(:public, *m.private_instance_methods(false))
end
ObjectSpace.each_object
遍歷所有模塊(包括類和單例類)並使它們(自己的) private_instance_methods
公開。
要僅公開單個對象,您可以使用:
my_object.singleton_class.send(:public, *my_object.private_methods)
通過更改單例類,只會影響my_object
實例。
請注意,默認情況下, private_methods
返回繼承的方法,包括許多來自Kernel
。 您可能希望傳遞false
以僅包含對象自己的私有方法。
就像是
my_object.class.private_instance_methods.each { |m| my_object.class.send :public, m }
我猜可能會幫助你射腿。 :)(但上面的答案更好)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.