🙆

[Ruby]classやselfについて

2023/09/08に公開

はじめに

Railsで多用するclassとなんとなくで使っていたselfについて、再度勉強したのでまとめました!

selfとは

selfとは、オブジェクト自身の事を言います。

オブジェクトとは?

プログラミングにおいては、「データや処理などを同じグループにした実体」をオブジェクトと呼ぶことが多いです。
その中でも、クラスを設計図として、インスタンスを生成することを前提とした言語は、
インスタンスをオブジェクトと呼ぶこともあります。
今まで学んできた文字列、数値、配列も、特定のクラスから作成されたオブジェクト(インスタンス)です。

selfには2種類あって、クラスメソッドとして使われるselfと、レシーバとして使われるselfがあります。

クラスメソッドとは

クラスメソッドは、クラスから実行できるメソッドです。
クラス全体に関わる情報を変更するメソッドを作成するときなどに使用します。
わかりやすい例として、インスタンスメソッドとクラスメソッドを比較すると以下のように呼び出す方法に違いがあります。

このようにインスタンスメソッドは、インスタンスを作成しインスタンスから呼び出し、
クラスメソッドは、クラスから直接呼び出しています。

クラスメソッドの書き方

クラスメソッドでは、メソッド名の前にselfがついています。 selfはクラス自身のことを示しています。
呼び出す際には、インスタンスの作成(クラス名.new)をせずに「クラス名.メソッド名」で呼び出せます。
※引数を設定するときは、メソッド名の後ろに()で書いてあげましょう。

class クラス名
  def self.メソッド名(引数)
  end
end

クラス名.メソッド名(引数)

...

class Car
  def self.run(distance)
    puts "車で#{distance}キロ走ります。"
  end
end

Car.run(10)

流れとしては

  1. Carクラスのrunメソッドを呼び出し
  2. runメソッドを上から読み込んでいく

流れは、インスタンスメソッドと同じです。
ポイントなのは、 selfは、クラス自身のことを示しているので
self.runは、Car.runを表しています。

superとは

「super」は、子クラスのメソッド内で定義すると、親クラス内にある同じ名前のメソッドを呼び出すことができます。

class Car
  def run(distance)
    puts "車で#{distance}キロ走ります。"
  end
end

class Bus < Car
  def run(distance)
    super
    puts "30人を乗せて、走っています。"  end
end

bus = Bus.new
bus.run(5)

書き方としてはメソッド内に「super」と定義するだけです。
「走る」という動作は、どの車にも共通している要素かと思います。
一方で、2行目の「30人を乗せて、走っている」というのは、バスなどの大型車にしかない要素と言えます。
このように、親クラスのメソッドにはない要素を追加したい時などに使用します。
上の記述だとsuperputs "車で#{distance}キロ走ります。"に該当します。
そのためターミナルで実行すると以下のような結果になります。

username:~/environment/ruby $ ruby override.rb
車で5キロ走ります。
30人を乗せて、走っています。

まとめ

Rubyを2~3日間で振り返ってみたところ、Railsで漠然と使っていたself``super、配列やハッシュなど理解不足だったところがたくさんでてきました。
この振り返りをやっていなっかったらと思うと少しぞっとするレベルでした。
この記事を書き始めてから、振り返りを習慣化できたら最強だなと毎日思ってます(笑)
明日からは一度、ポートフォリオの足らなかった点を総ざらいにして、修正しようと思います!

Discussion