Rubyのselfについて
メソッド名にselfをつけるとクラスから直接メソッドを呼ぶことができます。
つまりクラスメソッドとして扱います。
メソッド名にselfをつけないと指定したオブジェクト(レシーバ)に対してしかそのメソッドを使うことができません。
つまりインスタンスメソッドとして扱います。
コードを見ましょう。
class Foobar def foo puts "foo" end def self.bar puts "bar" end end #irb #クラスから呼ぶ > Foobar.foo NoMethodError: undefined method 'foo' for Foobar:Class > Foobar.bar bar => nil #オブジェクトから呼ぶ > foobar = Foobar.new => #<Foobar:0x007f39224cce28> > foobar.foo foo => nil >foobar.bar NoMethodError: undefined method 'bar' for #<Foobar:0x007f3922798f30>
オブジェクトとインスタンスの言葉の使い分けがぼんやりしている
クラスから呼んだ時はselfがついた方は表示され、ついてない方はno method errorが出てます。
オブジェクトから呼んだ時は逆になっています。
メソッドの呼び出しには必ずレシーバが必要で、クラスメソッドはあらかじめレシーバとしてself(自分自身のオブジェクト)が指定されているのでクラスから直接呼び出せる、という認識です。
特異クラス
クラスメソッドのみのクラスを作りたい時、selfを全てに書くのは面倒なので以下のように書くことができます。
class Singular class << self def foo puts ‘foo' end def bar puts ‘bar' end end end #irb > Singular.foo foo => nil >Singular.bar bar => nil
便利。
railsでselfを意識する時(?)
ちょっと適切なタイトルが浮かばない
例えばモデルクラスであるnew()やfind()はクラスメソッドですね。
ActionMailerでメールを加工する時はクラスメソッドでやってます。
指摘質問補足お待ちしています。
参考
class << self によるクラスメソッドの定義のイディオムの説明とその背景にある特異クラスのかんたんな解説 · GitHub
class FooはClassクラスのオブジェクトを生成している
そうなんだ