1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyの変数参照に関するいくつかの注意点

2022-02-04 12:14:33

Rubyが式の中でaのような名前を見たとき、aがローカル変数の参照なのか、引数のないメソッドaの呼び出しなのかを判断する必要があります。Ruby はソースコード・ファイルを解析するとき、値が割り当てられているすべてのシンボルを記録しています。これらのシンボルは変数とみなされます。その後、変数にもメソッドコールにもなりうるシンボルに出会ったとき、Rubyはそのシンボルに値が割り当てられているかどうかをチェックする。もしそうなら、そのシンボルは変数として扱われ、そうでなければメソッドコールとして扱われる。この状況を説明するために、人間が設計した例を示します。

def a
  print "Funciton 'a' called\n"
  99
end
 
for i in 1..2
  if i == 2
   print "a=",a,"\n"
  else
   a=1
   print "a=",a,"\n"
  end
end


  出力結果です。

a=1
Function 'a' called
a=99


  Rubyは解析の際、最初のprint文でaが使われていることを確認し、まだaへの代入に遭遇していないので、これをメソッド呼び出しとして扱います。しかし、2番目のprint文を解析するとき、Rubyはaへの代入に遭遇しているので、それを変数として扱います。

  なお、代入文は Ruby が見る限り、実行される必要はない。次のプログラムではエラーは発生しません。

a=1 if false;a