selfの扱い

modelでメソッドを書いていたときにすごいつまったのでメモ


railsのモデル内でのメソッドで以下のようなメソッドを作ったとする。

def fizz
 return "fizz"
end

def self.buzz
  self.fizz
end

このモデルからbuzzメソッドを呼び出すとエラーが出力されてしまう。

なぜかというと,

self.buzz

このselfはbuzzがクラスメソッドであることを表している.
つまり,buzzはインスタンスを経由せずにコード内にbuzzと書くことで動く.

self.fizz

このselfはメソッドを呼び出したインスタンスをよびだすためのselfである.こちらのselfはhoge.buzzとかかれたhogeを引用してhoge.fizzを実行しようとしている.


つまり,buzzはインスタンスなしで実行されているのに対して,fizzのselfがインスタンスを要求するためにおこるエラーだった.

rails難しいなー