ztbuz@dev

人生に絶望しているZが、それでも技術を身につけようと必死になるブログ

Rubyのインスタンスメソッドとクラスメソッドの使い分けについて

Ruby on Railsの学習中にModel周りで悩んでしまったのでメモ。 ひとことで言うと「クラス内のdef self.〜ってなんぞ?」という話についてです。

インスタンスメソッドとクラスメソッドの使い分け

コード例

たとえば、以下のようなコードがあるとします。 このとき、self.barクラスメソッドbazインスタンスメソッドとなります。

class Foo
  def self.bar
    p 'bar'
  end

  def baz
    p 'baz'
  end
end

インスタンスメソッド

インスタンスメソッドとは、newインスタンスを生成したときにのみ呼び出せるメソッドです。 生成するインスタンスによって異なる結果を返す場合に用いる、といったところでしょうか(となると上のコード例は微妙ですね……)。

foo = Foo.new
foo.bar # => undefined method `bar' for #<Foo:0x007f7f6413aae8> (NoMethodError)
foo.baz # => "baz"

クラスメソッド

クラスメソッドとは、ダブルコロン::)によってクラス経由で直接呼び出すメソッドです。 返る結果がインスタンスによらず一定の場合に用いる、という感じだと思います。

Foo::bar # => "bar"
Foo::baz # => undefined method `baz' for Foo:Class (NoMethodError)

また、インスタンスメソッドからクラスメソッドを呼び出すには、以下のように書きます。

def baz
  self.class.bar # => "bar"
end

おわりに

Javaを少し学んでいたときに曖昧にしていたのですが、改めて学習したことで理解が深まりました。 さて、次の記事を書き始めます。。。

参考記事