rubyにおける変数の種類
変数の種類が色々あってどう使い分けるかわからなかったので,自分用にメモを残す.
目次
- [ローカル変数]
- [インスタンス変数]
- [クラス変数]
- [グローバル変数]
ローカル変数
- 小文字or_(アンダーバー)で始まる.
- メソッドや,ブロック内のローカルなスコープで参照できる.
local.rb
def local()
a = 3
end
p a
# =>Traceback (most recent call last):
local.rb:5:in `<main>': undefined local variable or method `a' for main:Object (NameError)
localメソッドで定義されたaは,メソッドの外からは呼び出せない.
インスタンス変数
- @で始まる.
- 同じクラス内であれば,違うメソッドからも参照可能.
- インスタンスごとに値を保持できる.
instance.rb
class Instance
def set_val(val)
@val = val
end
def put_val
p @val
end
end
test1 = Instance.new
test1.set_val("aaa")
test1.put_val
test2 = Instance.new
test2.put_val
# =>
"aaa"
nil
インスタンスtest1の@valに,set_valメソッドを用いて,"aaa"を入れる.
その後,インスタンスtest2において,put_valを呼び出すが,nilが返ってくる.
ここから,各インスタンスごとに値を保持していることがわかる.
instance.rb
class Instance
def set_val(val)
@val = val
end
def put_val
p @val
end
end
test1 = Instance.new
test1.set_val("aaa")
test1.put_val
test2 = Instance.new
test2.set_val("bbb")
test2.put_val
# =>
"aaa"
"bbb"
インスタンスtest2に対してもset_valメソッドを用いる必要がある.
クラス変数
- @@で始まる.
- 同じクラスのすべてのインスタンスで共有される.
class.rb
class Instance
def set_val(val)
@@val = val
end
def put_val
p @@val
end
end
test1 = Instance.new
test1.set_val("aaa")
test1.put_val
test2 = Instance.new
test2.put_val
# =>
"aaa"
"aaa"
先ほどのインスタンス変数とは違い,値が同じクラスのすべてのインスタンスで共有されている.
class.rb
class Instance
def set_val(val)
@@val = val
end
def put_val
p @@val
end
end
test1 = Instance.new
test1.set_val("aaa")
test1.put_val
test2 = Instance.new
test2.set_val("bbb")
test2.put_val
test1.put_val
# =>
"aaa"
"bbb"
"bbb"
グローバル変数
- $で始まる.
- プログラムのどこからでも参照できる.
global.rb
class Global
def set_val(val)
$val = val
end
end
test1 = Global.new
test1.set_val("aaa")
p $val
# =>
"aaa"