簡體   English   中英

我可以暫時公開所有 Ruby 方法嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM