Ruby 変数とスコープ

グローバル変数
$をつけたもの。
どこからでも参照できる、なんでもアリな変数。
一見便利であるが、多用するとどこで値が変わっているかわからないコードになってしまう。

$var = "グローバルhoge"

class A
def hoge
puts $var
end
end

cls = A.new
cls.hoge

# 結果
# グローバルhoge



クラス変数
クラス、およびそのクラスのインスタンスすべてで参照できる変数。

class A
@@ClassHoge = "クラス変数hoge"
def hoge
puts "Aクラスのhoge"
end
end
class B < A
def hoge
puts @@ClassHoge
end
end

cls = B.new
cls.hoge

# 結果
# クラス変数hoge


上記の例では、Aを継承したBクラスからAのクラス変数を参照している。
これも多用するとソースの見通しが悪くなりそうな感じで、
使用はベースクラスのみにとどめておいたほうが良さそうな感じ。


インスタンス変数
インスタンス毎に別の値を持つ変数。
インスタンスを生成した時点では nil となる。

class A
@InstanceHoge = "クラス変数hoge"
def hoge
puts "Aクラスのhoge"
end
end
class B < A
def hoge
puts @InstanceHoge
end
end
class C < A
def hoge
@InstanceHoge = "書き換えたhoge!"
puts @InstanceHoge
end
end

BB = B.new
BB.hoge

CC = C.new
CC.hoge

# 結果
# nil
# 書き換えたhoge!



ローカル変数
メソッド内で使用される通常の変数。

class A
def hoge

foo = "ローカル変数"
puts foo


end
end

cls = A.new
cls.hoge

# 結果
# ローカル変数
# 上記の例で、変数名のみ表記した場合はエラーとなる



その他に参照専用であるが、擬似変数、というものもある。
とりあえず省略。

このブログの人気の投稿

コピーした行の挿入が表示されない時はフィルタされていないかチェック

Excel で一部の図形だけ固定する