From: Shugo Maeda Date: 2001-05-29T14:12:27+09:00 Subject: [ruby-list:29862] Re: "" で行われる展開を eval 無しで… 前田です。 At Tue, 29 May 2001 13:51:26 +0900, ABE Shigeru wrote: > vprint "#{foo}" (snip) >  もし foo がとても時間のかかるメソッドだとすると、使われな > いのに重い処理を行って、その結果を結局捨ててしまうことになり > ますよね? ですから、本当に使われるときにだけ foo を呼び出 > させたいのです。 (snip) >  他に方法はないのかなと思いまして、お聞きした次第です。 小迫さんが書かれたようにブロックを使って実行を遅延させるくらいし かないのではないでしょうか。 def foo puts "foo called" return "(result)" end def vprint $stderr.print(yield) if $OPT_v end vprint { "#{foo}\n" } puts "$OPT_v = true" $OPT_v = true vprint { "#{foo}\n" } > def vprint (*arg) > arg.collect! do |i| > eval( "\"#{i}\"" ) > end > $stderr.print( *arg ) if $OPT_v > end 単純にevalを使うと、評価されるコンテキストが違って来るのでまずい んじゃないかなと思います。 x = 1 vprint '#{x}', "\n" は、上の定義だと上手く動かないですよね。 -- 前田 修吾