【Ruby】 クラスメソッドからプライベートメソッドを呼ぶ方法

ruby エンジニア
記事内に広告が含まれています。

はじめに

Rubyでクラスメソッド内からprivateメソッドを呼び出したときに、

エラーが発生したのでそのときの対処法をご紹介します。

 

NGなパターン

1. クラスメソッドからプライベートメソッドを呼ぶ

私が最初に書いたエラーになるパターンのコードです。

class Sample1
  def self.foo
    bar
  end

  private

    def bar
      puts 'bar'
    end
end

> Sample1.foo
Traceback (most recent call last):
1: from test.rb:13:in `<main>'
test.rb:3:in `foo': undefined local variable or method `bar' for Sample1:Class (NameError)

 

2. private内でself.methodを定義する

こちらの場合は、エラーなく実行できますが、

privateメソッドを直接呼び出せてしまっているのでNGですね。

class Sample1
  def self.foo
    bar
  end

  private

    def self.bar
      puts 'bar'
    end
end

// エラーなく実行できる
> Sample1.foo
bar

// privateメソッドを呼べている
> Sample1.bar
bar

 

クラスメソッドからプライベートメソッドを呼ぶ書き方

特異クラス内でprivateを定義すれば、

クラスメソッドからプライベートメソッドを呼ぶことが可能になります。

class Sample2
  class << self # クラスメソッドで定義
    def foo
      bar
    end

    private

      def bar # クラスメソッド内でprivateメソッドを定義する
        puts 'bar'
      end
  end
end

> Sample2.foo
bar

最初のようにdef sefl.method endの書き方に合わせるなら

下記のようになります。

class Sample2
  def self.foo # クラスメソッドで定義
    bar
  end
  class << self

    private

      def bar # 特異クラス内でprivateメソッドを定義する
        puts 'bar'
      end
  end
end

> Sample2.foo
bar

コメント