DesignAssembler

備忘録に近い

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()はクラスメソッドですね。

rails.hatenadiary.jp

ActionMailerでメールを加工する時はクラスメソッドでやってます。

railsguides.jp

qiita.com

指摘質問補足お待ちしています。

参考

qiita.com

qiita.com

class << self によるクラスメソッドの定義のイディオムの説明とその背景にある特異クラスのかんたんな解説 · GitHub

class FooはClassクラスのオブジェクトを生成している
そうなんだ