LoginSignup
8
5

More than 3 years have passed since last update.

[Rails]selfについての理解を深めたい[初心者]

Posted at

はじめに

プログラミングの超初心者です。
selfへの理解が全然できていないと感じたので、アウトプットも兼ねて、学んだことをまとめます!
それではいきましょう!!

selfって何のこと?

オブジェクトそのものを指す特殊な変数です。

と、説明だけでは非常に分かりにくいですよね。
一緒に、どのように使用されているのか、確認していきましょう。

使用例

book.rb
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と打っていくのが面倒ですよね。
そこで使えるのが、特異クラスです。
使い方は、以下の通りです。

book.rb
class Book < ActiveRecord::Base
  class << Book
    def say_thanx
      puts "#{self}, thanx"
    end
  end
end

↑に、book = 'book'という条件を与えた上で、book.say_thanxを打ち込むと、book, thanxと出力されます。
全体の流れは、クラスメソッドと似通っていますが、<< Bookにより、bookオブジェクトの特異クラスを呼び出しているため、あくまでもオブジェクトに対しての特異メソッド、という定義です。

おわりに

自分でこの記事を書いていて、なんて初心者にはとっつきにくい概念なんだろうと思っています。
記事の中では、あくまで概念にしか触れていませんので、実際にアプリ制作で使用する際は、もっと実地に即した形での運用になると思います。
「なぜこの記載をしているのか」を大切にして、ただの丸暗記に終始することの無いよう、自戒を込めて執筆しました。

8
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5