Pages

2008/10/27

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

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



その他に参照専用であるが、擬似変数、というものもある。
とりあえず省略。
Related Posts Plugin for WordPress, Blogger...