スリ飯屋Malankaのフリーエンジニアな日々

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

【Ruby】privateメソッドはModule#instance_methodsでの検索対象外

privateメソッドは、Module#instance_methodsの検索対象外。

Hoge.instance_methods(false).include?(:public_method)
#=> インスタンスメソッドの名前が配列で返却される。

検証

  1. Articleモデルに、publicメソッドとprivateメソッドを定義。
class Article
  def test_public_method
    puts "publicメソッドです"
  end

  private

  def test_private_method
    puts "privateメソッドです"
  end
end
  1. Railsコンソールで確認。
[12] pry(main)> Article.new.test_public_method
publicメソッドです
=> nil

[13] pry(main)> Article.new.test_private_method
NoMethodError: private method `test_private_method' called for #<Article:0x00007fcae0e6ae30>
Did you mean?  test_public_method
from /Users/takeyoshimasaru/.anyenv/envs/rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/activemodel-6.0.2.1/lib/active_model/attribute_methods.rb:428:in `method_missing'

# publicメソッドが見つかる
[15] pry(main)> Article.instance_methods(false).grep(/test_public_method/)
=> [:test_public_method]

# privateメソッドは見つからない
[16] pry(main)> Article.instance_methods(false).grep(/test_private_method/)
=> []