7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby】クラス内のselfがつくメソッドとつかないメソッドの違い。クラスメソッドとインスタンスメソッドについて。

Posted at

クラスの中の関数定義時にselfがつくメソッドとselfがつかなメソッドが混在している場合がある。

それぞれに名称があり用途、呼び出し方が異なる。

##目次

  1. それぞれの要点まとめ
  2. 確認用の実例
  3. クラスメソッドとインスタンスメソッドの用途の違い
  4. 実用的な実例(シンプルなの)

##それぞれの要点まとめ それぞれの関係をまとめると以下のようになる。
項目 selfあり selfなし
メソッドの名称 クラスメソッド インスタンスメソッド
対象 クラス全体 インスタンスのみ
メソッド名の例 self.hello1 hello2
呼び出し方の例 クラス名.hello1 クラス名.new.hello2

##確認用の実例 実用性を無視してそれぞれの関数を定義し確認してみる。
class TestClass
  #selfありのメソッド
  def self.hello1
    p "self hello 1"
  end

  #selfなしのメソッド
  def hello2
    p "hello 2"
  end
end

クラスTestClassの中に、以下2つのメソッドがある。

  • self.hello1 :クラスメソッド
  • hello2 :インスタンスメソッド

それぞれの呼び出し方は以下のようになる。

####クラスメソッドの呼び出し
selfありメソッドを呼び出す方法

selfありメソッドを呼び出す
TestClass.hello1
=> "self hello 1"

#または
::TestClass.hello1
=> "self hello 1"

クラス名をオブジェクトとして直接メソッドを実行すればOK。

####インスタンスメソッドの呼び出し
selfなしメソッドを呼び出すためには、インスタンスを作成し、作成したインスタンスに対してメソッドを実行する必要がある。

selfなしメソッドを呼び出す
#インスタンスを生成し代入
inst = TestClass.new

inst.hello2
=> "hello 2"

#or
#インスタンスを生成し直接実行
TestClass.new.hello2
=> "hello 2"

##クラスメソッドとインスタンスメソッドの用途の違い **クラスメソッドはすべてのインスタンスで有効**なため、商品点数や人数の総合計を算出するメソッドとして用いられることが多い。

インスタンスメソッドはそのインスタンスのみで有効なため、商品の生成や人の生成などで使われることが多い。


###実用的な実例(シンプルなの) 商品カテゴリ毎に商品を登録するインスタンスと、すべてのカテゴリの商品数を足し合わせた商品点数を出力するクラスメソッドを定義したコード例。
クラス定義
class Product
  ######クラス全体
  #クラス変数(初期値0で初期化)
  @@product_ttl_num = 0

  #クラスメソッド
  def self.ttl_num
    p "商品点数: #{@@product_ttl_num}"
  end

  #####インスタンス毎
  #インスタンス生成時に自動で実行するメソッド
  def initialize(category)
    @product_category= category
    @product_list = []
  end

  #インスタンスメソッド(追加用)
  def add(name)
    @product_list.push name

    #クラス変数に1を追加
    @@product_ttl_num += 1
  end
end

クラスの定義は以上。次にインスタンスを生成する。

インスタンスの作成
##インスタンスの生成(phoneカテゴリ)
phone = Product.new(phone)

#インスタンスメソッド実行
phone.add("iphone6s")
phone.add("iphone12pro")


##インスタンスの生成(codesカテゴリ)
codes = Product.new(codes)

#インスタンスメソッド実行
phone.add("USB typeC")
phone.add("USB3.0")

phoneとcodesの2つのインスタンスを作成し、それぞれに商品を2つづつの計4つ登録。


クラスメソッドの実行
#クラスメソッド実行
Product.ttl_num

=> "商品点数: 4"

クラスメソッドを実行すると、すべてのインスタンスの商品の合計点数を得られる。

7
3
0

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
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?