如何在尊重隐私的同时动态调用方法

Emi*_*kol 6 ruby reflection visibility

使用动态方法调用(#send#method)忽略方法的可见性.
有没有一种简单的方法可以动态调用一个调用私有方法失败的方法?

and*_*hin 12

据我所知 - 你需要方法public_send:

----------------------------------------------------- Object#public_send
     obj.public_send(symbol [, args...])  => obj

     From Ruby 1.9.1
------------------------------------------------------------------------
     Invokes the method identified by _symbol_, passing it any arguments
     specified. Unlike send, public_send calls public methods only.

        1.public_send(:puts, "hello")  # causes NoMethodError
Run Code Online (Sandbox Code Playgroud)


Mar*_*une 6

使用public_send而不是send:

my_object.public_send :method, *args
Run Code Online (Sandbox Code Playgroud)

它是Ruby 1.9的新功能,所以对于较旧的Ruby,你可以require 'backports/1.9.1/kernel/public_send'.