上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Rubyのスコープについて1:ローカル変数とグローバル変数

スコープとは「ある変数がプログラムの中で参照可能な範囲」のことで、変数によってその範囲は異なります。

ローカル変数

●ブロックの外で宣言されたものは、ブロックの中でも有効
a = 1
1.times do
 puts a
end
#=> 1

●メソッドの外で宣言されたものは、メソッド内では無効
a = 1
def foo
 puts a
end
foo #=> エラー(NameError)

●メソッドの中で宣言されたものは、メソッド内、ブロック内で有効。メソッドの外では無効
def foo
 a = 1
 1.times do
  puts a
 end
 puts a
end
foo
#=> 1
#=> 1
puts a #=> エラー(NameError)

●ブロックパラメータとして宣言されたものは、そのブロックが終わるまで有効
1.times do |a|
end
puts a #=> エラー(NameError)

●宣言されていないローカル変数に対して、自己代入はできない
1.times do |a|
 x += a
end
puts x #=> エラー(NoMethodError:nilClassに'+'メソッドは定義されていないと表示される)

●ブロック内で宣言されたものは、そのブロックの終わりまで有効
2.times do
 puts defined?(a)
 a = 1
 puts a
end
#=> nil
#=> 1
#=> nil ※1回目で宣言されたaが2回目ではまた未宣言になっている
#=> 1
Rubyリファレンスマニュアル:変数と定数

●有効範囲内で宣言された変数は、同名のブロックパラメータの影響を受ける
a = 1
2.times do |a|
end
puts a #=> 2

●宣言を含む判定文は、実行されなくても宣言とみなされる
a = 1 if false # falseなので実行はされないが、aを宣言したことになる
1.times do
 puts a
end
#=> 1
Rubyリファレンスマニュアル:変数と定数



グローバル変数

●グローバル変数のスコープはプログラム全域
$a = 1
def foo
 1.times do
  puts $a
  $b = 2
 end
end
foo #=> 1
puts $b #=> 2

●未宣言のグローバル変数に代入してもエラーにならない
1.times do
 $a = 1
end
puts $a
#=> 1


PHPの場合、宣言していない変数に対して参照したり、自己代入してもエラーにはならないので、Rubyの方がこの辺りは厳格ですね。
プロフィール

星羽(榎田)

Author:星羽(榎田)
PHPエンジニアがRuby、PHPなどをいじった時の備忘録

最新記事
最新コメント
最新トラックバック
カテゴリ
スポンサードリンク
検索フォーム
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。