【ruby】Rubyで使われる変数のまとめ(ローカル変数、インスタンス変数、クラス変数、グローバル変数)

おはようございます。
今日はrailsで使う変数についてまとめていきたいと思います。
基本中の基本で重要ですが、分かっていなかったのでまとめます。

変数の種類

変数には大きく分けて4つあります。

  • ローカル変数
  • クラス変数

では一つ一つを詳しく見ていきます。

ローカル変数

ローカル変数とは定義したメソッドの中でしか使えない変数になります。
なので、メソッドをまたいでの使用はできません。
下の例では、initializeメソッドでローカル変数を定義しoutputメソッドで出力しようとしていますが、こちらはエラーとなります。

例)

class Hoge

  def initialize
    local = "これはローカル変数です" # ローカル変数を定義
  end

  def output
    put set_list 
  end

end

hoge = Hoge.new
hoge.output        #  =>  error


インスタンス変数

インスタンス変数(@変数)は先程のローカル変数とは違いメソッドをまたいだ使用ができる変数で定義する場所としてはメソッド内になります。
特徴としては、インスタンス変数がインスタンス毎に別々の値を持たせることができる変数である点にあります。
下の例は実際にアプリを動かしているコントローラーのコードです。
インスタンス毎に別々の値を持たせられる性質を利用しています。

例)

class SetListsController < ApplicationController

  def new
    @set_list = SetList.new 
    @event = Event.find(params[:id])
  end

  def create
    @set_list = SetList.new(set_list_params) 
  end

(以下略)

end


(補足)

複数のメソッドで同じインスタンス変数を使う場合、値は保持し続けます。

class Hoge

  def formula_1
    @counter = 1
  end

  def formula_2
    @counter += 1 
  end

  def output
    puts "#{@counter}"
  end

end

hoge = Hoge.new
hoge.formula_1
hoge.formula_2
hoge.output               # => 2
hoge.formula_2
hoge.output               # => 3


クラスの継承

さらにクラスの継承により親クラスのメソッドを持ってきて実行することができ、
そこで定義されたインスタンス変数を使用することができます。
上のコードにこちらを追加しても、ちゃんと動きます。

class Huga < Hoge
  def huga_output
    puts "#{@counter}"
  end
end

huga = Huga.new
huga.formula_1
huga.huga_output    # => 1



(注意)
新しくHugaクラスのインスタンスが生成されているので継承されているHogeクラスのメソッドでインスタンス変数を再定義する必要があります。


クラス変数

クラス変数(@@変数)はメソッド内だけでなくクラス内でも使用することのできる変数で、クラス内で共通の値を定義するのに使われます。
最大の特徴は新しくインスタンスを生成しても値が初期化されず、そのまま使うことができます。
下の例では、Hugaクラスのインスタンス生成後、再定義することなくクラス変数が使えていることが分かります。

class Hoge

@@counter = 0

  def formula_1
    @@counter += 1
  end

  def output
    puts "#{@@counter}"
  end

end

class Huga < Hoge
  def huga_output
    puts "#{@@counter}"
  end
end

hoge = Hoge.new
hoge.formula_1
hoge.output        # => 1

huga = Huga.new
huga.huga_output      # => 1  


グローバル変数

グローバル変数とはどのスコープからでも呼び出すことのできる変数になります。
クラス変数のように継承をする必要もなく一見すると便利ですが、変数名の被りなどエラーの原因にもなりうるので注意が必要な関数でもあります。
下の例では、クラスの継承なしにグローバル変数を引っ張ってこれているのが分かります。もちろん、クラス外に定義も可能です。

例)

class Hoge
  $grobal = "これはグローバル変数です"
  def output
    puts "#{$grobal}"
  end
end

class Huga
  def huga_output
    puts "#{$grobal}"
  end
end

hoge = Hoge.new
hoge.output     # => これはグローバル変数です

huga = Huga.new
huga.huga_output     # => これはグローバル変数です


まとめ

以上、ここまで読んでくださり、ありがとうございました。
rubyを扱う上で最低この4つの変数(特にインスタンス変数)の理解は必要かなと思い、復習がてらまとめました。
分かりにくいやアドバイス等ありましたらコメントくださると幸いです。では!