#ローカル変数
ローカル変数には有効範囲があり、関数を飛び越えて使う事等は出来ません。
変数にはローカルとグローバルが存在しますが、一般的にただ"変数"として呼ばれるもののは多くはローカル変数みたいです。
例えば以下のプログラムでは一見すんなりと**「3」が出力されそうなものですが、1を代入されたa**はメソッド外で作られたローカル変数の為、外部のメソッドや関数では使う事が出来ないのです。
この場合 undefined local variable or method `a' for main:Object (NameError)
というエラーが出ます。
a = 1
def test
b = 2
puts a + b
end
test()
#グローバル変数
ローカル変数は関数を飛び越えて使う事は出来ないのに対して、グローバル変数は自由にどこからでも使えます。
Rubyの場合関数名の前に***$***をつける事で、グローバル変数として扱う事が可能です。 この場合エラーも出ず正常に 3
が出力されます。 しかし、グローバル変数は一般的に避けるべきだと言われています。
$a = 1
def test2
b = 2
puts $a + b
end
test2()
#グローバル変数を避けるべき理由
まだ自分も理解を深められていませんが、多くはバグの温床になりやすい事にあるようです。 小規模なプログラミングを一人で行っている立場では、たかが変数と思い無駄にグローバル変数を増やしたところで、動作や実装にはそこまで問題ないと思います。 しかしこれがよりスペックの劣るサーバーかつ、複数人によって操作を行われる環境に置かれると、グローバル変数はどこからでも操作することが出来てしまいます。 これによって誤って他の関数から書き換えられてしまったり、変数名が被ってしまい正常な動作を行わなくなってしまう場合があるようなのです。
また厄介なのは、単なる構文の誤りとは別であるため、エラーメッセージが出ない場合があり、そうなると無数の変数からバグの原因を見つけなければなりません。
プログラムが、グローバル変数を使わなければ正常に動作しないような設計である場合は、そのプログラムを改めて見つめ直すべきだと感じます。 といってもついつい使ってしまうのですが・・・(反省)