From: Koji Arai Date: 1998-11-20T04:33:21+09:00 Subject: [ruby-list:10976] スコープの範囲 新井です。 スコープの範囲について質問です。 #!/usr/local/bin/ruby p "iterator" [1,2].each {|i| print defined?(v) ? v : "undefined\n" v = "defined\n" } print defined?(v) ? v : "undefined\n" __END__ このスクリプトの結果は、以下のようになりますがそう いうものなんですかね? 右のコメントは、私の直観です。 "iterator" undefined これは、当然。 undefined あれ?違うの? undefined うん、スコープから抜けるからね。 2番目は直観とは違うけど、仕方ないのかな、とも思いました。 というのもイテレータはスコープを作るからyieldから 抜けた時点でイテレータの変数が消えると解釈したから です(あってます?)。 class Array def each i = 0; while i < self.size yield(self[i]) # ここで、イテレータのスコープの変数は消去 i += 1 end end end でも、スコープを作らない(と思われる) for や while でも同じでした。 そういうものなんですかね? #!/usr/local/bin/ruby p "for" for i in [1,2] print defined?(v) ? v : "undefined\n" v = "defined\n" end print defined?(v) ? v : "undefined\n" __END__ "for" undefined 当然 undefined あれれ? defined スコープを作らないからね #!/usr/local/bin/ruby p "while" a = [1,2] while a.shift print defined?(v) ? v : "undefined\n" v = "defined\n" end print defined?(v) ? v : "undefined\n" __END__ "while" undefined for と一緒 undefined defined 希望としては、いずれも直観の通りに動いて欲しいんですが… 動作は、ruby-1.1c7 で確認してます # 1.1c8は今のところ様子見なんです # 流量の多いruby-listからパッチを集めるのは大変。