クラスの中の関数定義時にselfがつくメソッドとselfがつかなメソッドが混在している場合がある。
それぞれに名称があり用途、呼び出し方が異なる。
目次
## それぞれの要点まとめ それぞれの関係をまとめると以下のようになる。
| 項目 | 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"
クラスメソッドを実行すると、すべてのインスタンスの商品の合計点数を得られる。