岩月と申します。
6行目の時点では ofp は定義されていないため、
例外が発生します。ですので、たとえば ofile = ""
の次の行にでも ofp = nil と書いておきましょう。
ofile = ""
ofp = nil
alist.each{|file|
(以下略)
今回の問題を再現するために別のコードを書きました。
flag = false
2.times do |count|
p(count, local_variables)
flag && p(ivar) # 2周目に例外が発生する
ivar = 123
flag = true
end
処理の流れだけを見ると、一回目のループの中で ivar = 123 が
あるから、二回目のループの p(ivar) は動きそうな気もしますが、
実際には同様の例外が発生します。
0
["flag", "ivar", "count"]
1
["flag", "ivar", "count"]
ivar_scope.rb:4: undefined local variable or method `ivar' for
main:Object (NameError)
from ivar_scope.rb:2
ちゃんと調べたわけではないので自信ありませんが、
1周目の最後で ivar = 123 として定義されたローカル変数が、
2周目の冒頭では無かったことにされているんじゃないかなあと
予想してます。つまり
# まだ ivar は存在しない
ivar = 123
# ivar はあるよ
という感じではないかと。
ただ、local_variables でローカル変数を見ると ivar = 123 より以前でも
ivar があるようにも見えます。この辺はちゃんと理解していないので
わかりません。
--
IWATSUKI Hiroyuki <URL:mailto:don / na.rim.or.jp>