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を少し学んでいたときに曖昧にしていたのですが、改めて学習したことで理解が深まりました。 さて、次の記事を書き始めます。。。