From: Koji Arai Date: 1998-11-23T15:54:36+09:00 Subject: [ruby-dev:3642] Re: block local variable (Re: スコープの範囲) 新井です。 >>> From: Shin-ichiro Hara >>> Date: Mon, 23 Nov 1998 12:28:33 +0900 >>> Subject: [ruby-dev:3636] Re: block local variable (Re:スコープの範囲) > 原です。 > > > 前田です。 > > > 新井> $/ := nil > > > $/はローカル変数ではないのでparse errorになってしまいます。 > > もともとの新井さんの要望は、システムに関わる大域変数を一時的に > 変えたいということだったのでは?だからこれこそしたいことだった > んですよね。 あう、それは違います。$/:=nil は思い付きで余計なこ と書いてしまいましたが、このスレッドの本質ではない です。($/:= が採用されても、ブロックを無理矢理作ら なくてはならないから、あまりうれしくなかった) グローバル変数を一時的に退避したい場合は、 ruby-list:11014 のようなものが標準でつけば問題ない です。(と、さりげなく要望 ^^;) 再掲すると、([ruby-list:10996]) > > 【2】イテレータのブロックでは、そこで初めて定義されたローカル変数は > > 局所化される。 > > > イテレータではブロック外部のローカル変数(小文字で始まるの変数)にアク > > セス出来る。 > > 局所化されるかどうかを文法で区別できないのは少し痛 > いですね。 > > イテレータを書くときは、常に局所変数の名前がダブら > ないように気を使わなくてはいけないですから。 > > evalも同じ。 と考えるわけです。 #!/usr/local/bin/ruby $assign = %Q{v = 2; p v} eval $assign # => 2 局所化されてる p v if defined?(v) # => v = 1 # eval より前に定義 p v # => 1 eval $assign # => 2 局所化されない p v # => 2 eval によって値が壊される __END__ ということから、evalの中で局所変数を使うのが難しい。 あまり、こういうことはやらないのかもしれないし、解 法もある。 #!/usr/local/bin/ruby def dummyscope binding end $assign = %Q{v = 2; p v} eval $assign, dummyscope # => 2 局所化されてる p v if defined?(v) # => v = 1 # eval より前に定義 p v # => 1 eval $assign, dummyscope # => 2 局所化されてる p v # => 1 __END__ だけど、無理矢理スコープを作るのもなんか変。 イテレータの場合は、うまい例が思い付かないけど、ス クリプトを上から順に書いているうちは問題に当たらな いのではないかと予想してます。(不用意にエディタで カット&ペーストをするとあれ?ってことになるのでは ないでしょうか?) 考え方が変なのかなぁ?