【ruby】Rubyで使われる変数のまとめ(ローカル変数、インスタンス変数、クラス変数、グローバル変数)
おはようございます。
今日はrailsで使う変数についてまとめていきたいと思います。
基本中の基本で重要ですが、分かっていなかったのでまとめます。
ローカル変数
ローカル変数とは定義したメソッドの中でしか使えない変数になります。
なので、メソッドをまたいでの使用はできません。
下の例では、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
クラス変数
クラス変数(@@変数)はメソッド内だけでなくクラス内でも使用することのできる変数で、クラス内で共通の値を定義するのに使われます。
最大の特徴は新しくインスタンスを生成しても値が初期化されず、そのまま使うことができます。
下の例では、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 # => これはグローバル変数です