From: Koji Arai Date: 1998-11-25T21:13:20+09:00 Subject: [ruby-dev:3675] Re: block local variable (Re: スコープの範囲) 新井です。 >>> From: matz@netlab.co.jp (Yukihiro Matsumoto) >>> Date: Tue, 24 Nov 1998 12:58:41 +0900 >>> Subject: [ruby-dev:3651] Re: block local variable (Re:スコープの範囲) > まつもと ゆきひろです > * 引数として渡した文字列があたかもそこにあるかのように動作 > する > > * が,既にコンパイル時に決まってしまった情報を変更すること > はない > > を押えておいて下さい.やや難しいのは > > * ローカル変数の defined? チェックは静的に行われる > > 点でしょうか.メソッドなどは定義そのものが動的ですから, > defined? のチェックがぜんぶ静的というわけではないというのが > ちょっといやらしいですね. ん?ちょっとわかりにくい(あたまワルいんです私)。 #!/usr/local/bin/ruby $assign = %Q{v = 2; p v} eval $assign # => 2 # 最初のコンパイル時にこのあたりの v への束縛情報 # がないだけで、上のevalがイテレータのように局所化 # されてると考えてはいけない(局所化されているが、 # イテレータとは仕組みが違う) p v if defined?(v) # => v = 1 # これ以降は、この v にアクセスできる # このことは、最初のコンパイルで決定 p v # => 1 eval $assign # => 2 p v # => 2 eval によって値が変更されるのは普通の動作 __END__ ということですか? さらに言えば、最初の eval で定義された v は、他の v と異なり別次元にいっちゃってる v なんですね。ん? 重要なのは、 「局所変数のスコープはコンパイル時に決定している」 ということか。 うーん、わかったような、わからんような。 「静的」と「動的」の混在がモノゴトを複雑にしているんですね。