アプリ版:「スタンプのみでお礼する」機能のリリースについて

DATA.each do |line|
if /code,(.+)/=~line
code=$1
elsif /name,(.+)/=~line
puts "code=#{code} name=#{$1}"
end
end
__END__
code,001
name,ipp
code,002
name,opp

上記実行結果は以下の様に変数codeの値が出力されません。
code= name=ipp
code= name=opp

ところがプログラムの一行目をwhile line = DATA.getsに変更すると、以下の様に値が出力されます。
code=001 name=ipp
code=002 name=opp

どういう理屈なんでしょうか? 教えていただけませんか?
また、DATA.each do |line|の書式で、変数code(DATAの一行前で代入した値)を有効にする方法はあるのでしょうか?

A 回答 (1件)

eachはスコープを生成するので、


code=$1はeachブロック内のローカル変数と見なされます。
そのため、code=$1を通らないときはcodeに対する代入が行われていないと見なされ、
code==nilとなります。

Rubyリファレンスマニュアル - trap::スコープ、制御構造
http://www.ruby-lang.org/ja/man/?cmd=view;name=t …
より引用
| while や for がスコープを作らないのに対し、loop や each などのイテレータはスコープを作ります。


> DATA.each do |line|の書式で、変数code(DATAの一行前で代入した値)を有効にする方法はあるのでしょうか?
----
code=""
DATA.each do |line|
#後略
----
のように、あらかじめ変数codeを宣言(代入)しておけばよいです。


[参考]
http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/r …
    • good
    • 0
この回答へのお礼

ありがとうございます。理解できました。

お礼日時:2007/11/08 14:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!