From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2007-08-18T22:22:00+09:00 Subject: [ruby-dev:31488] Re: setter of $! けいじゅ@いしつかです. In [ruby-dev:31473] the message: "[ruby-dev:31473] setter of $!", on Aug/18 13:02(JST) SASADA Koichi writes: > ささだです。 > YARV での都合上、$! を readonly にしたいんですが、良いでしょうか。 >出来ないと困る例とかってどれくらいあるでしょうか。 私の関係では, lib/e2mmap.rb と lib/irb.rb で使っています. e2mmap.rb では, 以下のような感じに使っています. def E2MM.Raise(klass = E2MM, err = nil, *rest) if form = e2mm_message(klass, err) $! = err.new(sprintf(form, *rest)) $@ = caller(1) if $@.nil? $@.shift if $@[0] =~ /^#{Regexp.quote(__FILE__)}:/ raise else E2MM.Fail E2MM, ErrNotRegisteredException, err.inspect end end 何でこうなっているかというと, $! に設定せずに raise err.new(sprintf(form, *rest)) とすると, $@が再設定されてしまうからのような気がします. 無理すれば対処 できないではないですが... def E2MM.Raise(klass = E2MM, err = nil, *rest) if form = e2mm_message(klass, err) begin raise err.new(sprintf(form, *rest)) resuce err $@ = caller(1) if $@.nil? $@.shift if $@[0] =~ /^#{Regexp.quote(__FILE__)}:/ raise end else E2MM.Fail E2MM, ErrNotRegisteredException, err.inspect end end かなぁ... なんか, 何でこうなっているのか分からなくなりそうですが... lib/irb.rb では @scanner.each_top_level_statement do |line, line_no| signal_status(:IN_EVAL) do begin line.untaint @context.evaluate(line, line_no) output_value if @context.echo? rescue StandardError, ScriptError, Abort $! = RuntimeError.new("unknown exception raised") unless $! print $!.class, ": ", $!, "\n" と言う感じなんですが, $! が設定されていない例外の場合の対処なんですが, こんなことあり得るのかなぁ? って気がしないでもないですが, 過去にはそう いうことがあったので, このような処理が入っているのではないかと思います. まあ, こっちも代入できなくてもどうにか対処できると思いますが... __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---