好ましくはないですが、通常Rubyでprivateなメソッドを呼び出したい時にはsend
を使うケースが多いです。
しかしライブラリの破壊的変更等によりpublicだっだメソッドがprivateになる等、すでに大量に依存しているケースですべてをsend
に直すのは大変なケースもあります。
そういうケースではModule#public
を使うと任意のprivateメソッドをpublicにできて便利だったので使い方をメモ📝
当たり前ですが、以下の実装はprivate method
private_foo' called for an instance of Foo (NoMethodError)`が発生し、エラーになります。
class Foo def public_foo puts "public_foo" end private def private_foo puts "private_foo" end end puts Foo.new.private_foo #=> test.rb:17:in `<main>': private method `private_foo' called for an instance of Foo (NoMethodError) # puts Foo.new.private_foo # ^^^^^^^^^^^^ # Did you mean? private_methods
しかし、以下のような感じでpublic :private_foo
を使うと外からpublicなメソッドに変更することができます。
class Foo def public_foo puts "public_foo" end private def private_foo puts "private_foo" end end Foo.class_eval { public :private_foo } puts Foo.new.private_foo # => private_foo