Rubyで使われる変数の中に「ローカル変数」「グローバル変数」「インスタンス変数」「クラス変数」があります。
これらを備忘録としてメモ。
はじめに
この記事は筆者の、Ruby勉強時のメモ的な役割になっております。
一部間違っている可能性や理解が乏しい箇所もあるため、注意してください。
ローカル変数
ローカル変数は、言ってしまえば「普通の変数」です。
例えば、メソッド内で作成した「a」という変数は、別のメソッドから値を変更できない「ローカル(地方的)」な変数になる。
ローカル変数の書き方は「a」になる。
その他の変数は、頭に語を付属する必要があるのでそれぞれ確認してください。
グローバル変数
ローカル変数に対して、グローバルな変数という意味を持つ。
グローバル( 世界規模 )とあるように、ローカル変数とは違い「プログラム内」のどこからでも値を変化させることができる。
グローバル変数の書き方は「$a」となる。
ローカル変数を基準として捉えるのであれば「$」を先頭に付属するという書き方が正しいと思います。
ただし前述の通り、グローバル変数はプログラム内のどこからでも値の変更ができてしまう為め、意図しない時に変数名が被ってしまうことがある。
そのため管理が難しく、多人数開発には向かない。
インスタンス変数
インスタンス内で値を変化できる変数。
書き方は、頭に「@」をつけて「@a」のように定義する。
ローカル変数と似ているが、インスタンス変数の場合、インスタンスごとに値を設定することができる。
詳しくは以下参照。
※規約に対する名前のつけ方は適当。
class ABC
def set_text(str)
@instance_hensuu = str
local_hensuu = str
end
def puts_text
puts ">#{@instance_hensuu}"
# puts ">#{local_hensuu}" <- エラー end end instance1 = ABC.new() instance1.set_text("instance1") instance2 = ABC.new() instance2.set_text("instance2") instance1.puts_text() instance2.puts_text() # => >instance1
# => >instance2
結果はローカル変数「local_hensuu」はエラーを吐き、instance1とinstance2では「それぞれ別の値を追加」できた。
(instance1.puts_text()には引数がないため省略可)
ちなみに、インスタンス変数は「クラスメソッド」からの呼び出しはできない。
class ABC
def set_text(str)
@instance_hensuu = str
# local_hensuu = str
end
def puts_text
puts ">#{@instance_hensuu}"
# puts ">#{local_hensuu}"
end
def self.class_method
p @instance_hensuu
end
end
instance1 = ABC.new()
instance1.set_text("instance1")
instance2 = ABC.new()
instance2.set_text("instance2")
instance1.puts_text
instance2.puts_text
ABC.class_method
# >instance1
# >instance2
# nil
クラス変数
インスタンス変数を元に考えると、クラス変数は「クラス内で共有できる」変数になる。
先ほどのコードでは、クラスメソッドを出力した時「nil」になってしまった。
instance_hensuuをクラス変数にすることで、クラスメソッドからも値を変化できる。
インスタンス変数と似ているが「@@a」のように定義することで、クラス変数を作成できる。
先ほどのコードをそのまま使って、クラス変数の挙動を確認すると以下のようになった。
class ABC
def set_text(str)
# @instance_hensuu = str
# local_hensuu = str
@@class_hensuu = str
end
def puts_text
# puts ">#{@instance_hensuu}"
# puts ">#{local_hensuu}"
puts ">#{@@class_hensuu}"
end
def self.class_method
# p @instance_hensuu
p @@class_hensuu
end
end
instance1 = ABC.new()
instance1.set_text("instance1")
instance2 = ABC.new()
instance2.set_text("instance2")
instance1.puts_text
instance2.puts_text
ABC.class_method
# >instance1
# >instance2
# "instance2"
このように出力された。
まとめ
グローバル変数 -> メソッドを越えて、プログラムのどこからでも動作する変数。
インスタンス変数 -> インスタンス内で動作する変数。
クラス変数 -> クラス内のどのインスタンスからでも動作する変数。
このほかにも、「クラスインスタンス変数」と呼ばれる、クラス内のオブジェクトのインスタンス変数や、擬似変数と呼ばれるものもあるが、それについてはまたの機会に。
ではまた。