はじめに
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
コメント