[#42243] コミュニティと宗教の分離について — Beyond <beyond@...>

14 messages 2006/05/21

[#42267] メニューのループについて — リックス <rubyer4649@...>

りっくすです

21 messages 2006/05/27

[#42301] Re: メニューのループについて — "conundrum /" <conundrum@...>

conundrumです。

11 messages 2006/05/28

[ruby-list:42256] Re: File objectがいつのまにか nilに、

From: "Hiroyuki Iwatsuki" <don@...>
Date: 2006-05-23 06:47:54 UTC
List: ruby-list #42256
岩月と申します。

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>

In This Thread