読者です 読者をやめる 読者になる 読者になる

Ruby の private メソッドを外部から呼び出す

Ruby

[関連]

さて、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