【Ruby】クラスについて整理する

2020年5月6日プログラミング

【Ruby】インスタンス変数、イニシャライザ、アクセサについて整理する

どうも、てーやまです。

クラスについても疎いです。なので整理します。

インスタンス変数

インスタンス変数はクラス(オブジェクト生成時のひな形)に持っている変数です。Rubyでは@付きで定義されます。

イニシャライザ

インスタンス作るときに必ず実行されるメソッドです。

#classを定義
class Fun

  def initialize #イニシャライザ
    @fun = 'music' #インスタンス変数
  end

  def fun
    puts @fun
  end
end



#Funクラスのインスタンスを生成
play = Fun.new
play.fun

#実行結果
music
=>nil

アクセサ

Rubyにはアクセサと呼ばれる機能があります。

インスタンス変数を変更したり、中身を参照するのに、全てのインスタンス変数にメソッドを作っていたのでは大変だからです。

アクセサを使うと次のようにclassを簡略化して書くことができます。

class Fun
  attr_accessor :fun #アクセサ
end

play = Fun.new
#インスタンス変数funの中身を出力してみる
puts play.fun
#実行結果

=>nil

#インスタンス変数funの中身を変更してみる
play.fun = 'music'
puts play.fun
#実行結果
"music"
=>nil

#ちなみにインスタンス変数はインスタンスごと独立している
favorite = Fun.new
puts favorite.fun
#実行結果

=>nil

これはアクセサの場合、インスタンス生成時のイニシャライザはインスタンス変数にnilを入れていることが分かります。

またインスタンス変数は、インスタンスごとに値が違うことが分かります。

クラス変数

クラス変数はクラスで共有する変数です。

先の例のようにインスタンスが別れても、クラスで持ち回る値のため、変更されません。

クラス変数は@@を頭につけて表現されます。

class Sum
  #クラス変数の定義
  @@fix = 1

  def watch
    puts @@fix
  end

  def inc
    @@fix += 1
  end
end

#インスタンスを2つ生成
num1 = Sum.new
num2 = Sum.new

num1.watch
#実行結果
1
=>nil

num1.inc
=>2

#インスタンスを変えてクラス変数を参照してみる
num2.watch
#実行結果
2
=>nil