#はじめに
プログラミングの超初心者です。
self
への理解が全然できていないと感じたので、アウトプットも兼ねて、学んだことをまとめます!
それではいきましょう!!
#selfって何のこと?
オブジェクトそのものを指す特殊な変数
です。
と、説明だけでは非常に分かりにくいですよね。
一緒に、どのように使用されているのか、確認していきましょう。
#使用例
class Book < ActiveRecord::Base
def hoge #インスタントメソッド
end
def self.hoge #クラスメソッド
end
def author #インスタントメソッド
self.hoge #インスタンスメソッドのhogeが呼ばれる
hoge #インスタンスメソッドのhogeが呼ばれる
self.class.hoge
end
def self.author #クラスメソッド
self.hoge #クラスメソッドのhogeが呼ばれる
hoge #クラスメソッドのhogeが呼ばれる
end
end
#クラスメソッド(特異メソッド)とは?
さて、クラスメソッド
とは一体、何を指しているのでしょうか?
ざっくりの認識では、クラス全体の中から何かを取り出す
際に使用するものです。
一つ一つのインスタンスには紐づいておらず、クラスに対して働きかけるメソッド、とも言い換えられるでしょう。
後述する特異クラス
と分ける形で、特異メソッド
と呼ばれます。
メソッドの呼び出しには、必ずレシーバが必要になります。
クラスメソッドには、あらかじめレシーバとしてself(自分自身のオブジェクト)が指定されているので、クラスから直接呼び出せる仕掛けになっています。
#インスタントメソッドとは?
では、インスタントメソッド
とは何ぞや、となるでしょう。
簡単に説明すると、特定のインスタンスから、何かを取り出す
際に使用されるもの、という認識でOKです。
逆に言うと、メソッド名にself
を付けないと、指定したオブジェクト(レシーバ)に対してしか、そのメソッドを使用することが出来ないということです。
#特異クラスとは?
クラスメソッドの中で、別名特異メソッド
と紹介していたのを覚えていますか。
実際は、クラスメソッドで毎回self
と記載すれば大丈夫なのですが、クラスメソッドが複数に渡る場合は、いちいちself
と打っていくのが面倒ですよね。
そこで使えるのが、特異クラス
です。
使い方は、以下の通りです。
class Book < ActiveRecord::Base
class << Book
def say_thanx
puts "#{self}, thanx"
end
end
end
↑に、book = 'book'
という条件を与えた上で、book.say_thanx
を打ち込むと、book, thanx
と出力されます。
全体の流れは、クラスメソッドと似通っていますが、<< Book
により、bookオブジェクトの特異クラスを呼び出しているため、あくまでもオブジェクトに対しての特異メソッド、という定義です。
#おわりに
自分でこの記事を書いていて、なんて初心者にはとっつきにくい概念なんだろう
と思っています。
記事の中では、あくまで概念にしか触れていませんので、実際にアプリ制作で使用する際は、もっと実地に即した形での運用になると思います。
「なぜこの記載をしているのか」を大切にして、ただの丸暗記に終始することの無いよう、自戒を込めて執筆しました。