Ruby の private メソッドを外部から呼び出す
[関連]
さて、Ruby の private メソッドは『レシーバをつけて呼び出すことができない』という仕様です。
なので、本来であれば『メソッドを外から呼び出す場合はレシーバをつける必要がある』ので自身からしか private メソッドを呼び出すことはできない。
と、思っていたんですが抜け道がありました。
[#send メソッドを使う]
次のように #send
メソッドを使うことで外部から private メソッドを呼び出すことができます。
class X private def private_method "private_method" end end x = X.new x.send(:private_method) # => "private_method"
確かに #send
メソッドを経由することで『レシーバをつけないで』メソッドを呼び出すことができますね。
Ruby の private メソッドがばがばだなぁ…。
ちなみに慣習としてライブラリ内で #send
を使う場合、『#send
は書き換えられる可能性があるので #__send__
を使ったほうがよい』らしい。
[参照]
http://docs.ruby-lang.org/ja/2.2.0/method/Object/i/send.html