こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Ruby while line = DATA.gets と DATA.each do |line| の違い

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の一行前で代入した値)を有効にする方法はあるのでしょうか?

投稿日時 - 2007-11-08 13:16:20

QNo.3499991

暇なときに回答ください

質問者が選んだベストアンサー

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

Rubyリファレンスマニュアル - trap::スコープ、制御構造
http://www.ruby-lang.org/ja/man/?cmd=view;name=trap%3A%3A%A5%B9%A5%B3%A1%BC%A5%D7%A1%A2%C0%A9%B8%E6%B9%BD%C2%A4
より引用
| 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/ruby/ruby-list/8472?8393-8678

投稿日時 - 2007-11-08 13:51:36

お礼

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

投稿日時 - 2007-11-08 14:01:21

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問