From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-08-27T13:04:42+09:00 Subject: [ruby-dev:275] Re: [BUG] MLF けいじゅ@日本ラショナルです. またまたバグレポート+質問です. In [ruby-dev :00270 ] the message: "[ruby-dev:270] Re: [BUG] MLF ", on Aug/26 22:28(JST) keiju@bc.mbn.or.jp (石塚圭樹) writes: 1. instance_eval class Foo end f = Foo.new f.instance_eval %q{ def foo print "foo" end } f.foo ----------------- mop.rb:143: NameError: private method `foo' called for #(Foo) となります. ちなみに: f.instance_eval %q{ def foo print "foo" end public :foo } はできないんですねぇ... 2. ?? e2mmap.rbに絡んでいて, 話しがややこしいのですが, 良く分からないことが 発生しているので教えて下さい. 以下のソースの中の[A]を見て下さい. self.instance_eval ... となっているのですが, これを self.module_eval ... としても同じ動作をしているようです. ここでの self は class Foo extend Exception2MessageMapper def_exception(:EFoo, "efoo") end とした時の Exception2MessageMapper.extend_object(cl) で渡るクラスにな るので, この場合なら Foo というクラスになっていると思います. そうすると, Foo.instance_eval と Foo.module_eval では動作が違うはずなんですが, 例えば, def foo... とすると両方とも Foo#fooが定義されます... module_evalでは Foo.fooが定義されるはずですよ ね.... これは一体どういうことなのでしょう? # ちなみに, 先ほどのバグレポートがあるにも関わらず instance_eval が動 # 作するのもなぞですが... -- e2mmap.rb module Exception2MessageMapper RCS_ID='-$Header: /home/keiju/var/src/var.lib/ruby/RCS/e2mmap.rb,v 1.4 1997/08/18 07:12:12 keiju Exp keiju $-' # E2MM = Exception2MessageMapper def Exception2MessageMapper.extend_object(cl) super cl.bind(self) end def Exception2MessageMapper.extend_to(b) c = eval("self", b) c.extend(self) end def bind(cl) begin map = const_get(:E2MM_ErrorMSG, TRUE).dup rescue NameError map = Hash.new end const_set(:E2MM_ErrorMSG, map) print self.inspect, "\n" # [A] self.module_eval self.instance_eval %q^ def fail!(*rest) super end # fail(err, *rest) # err: 例外 # rest: メッセージに渡すパラメータ # def fail(err, *rest) if form = E2MM_ErrorMSG[err] $! = err.new(sprintf(form, *rest)) $@ = caller(0) $@.shift super() else Exception2MessageMapper.fail Exception2MessageMapper::ErrNotRegisteredException, err.to_s end end public :fail # def_exception(c, m) # c: exception # m: message_form # 例外cのメッセージをmとする. # def def_e2message(c, m) E2MM_ErrorMSG[c] = m end # def_exception(c, m) # n: exception_name # m: message_form # s: 例外スーパークラス(デフォルト: Exception) # 例外名``c''をもつ例外を定義し, そのメッセージをmとする. # #def def_exception(n, m) def def_exception(n, m, s = Exception) n = n.id2name if n.kind_of?(Fixnum) e = Class.new(s) const_set(n, e) # E2MM_ErrorMSG[e] = m const_get(:E2MM_ErrorMSG)[e] = m print inspect, "\n" print E2MM_ErrorMSG.inspect, "\n" print const_get(:E2MM_ErrorMSG).inspect, "\n" end ^ end extend Exception2MessageMapper def_exception(:ErrNotClassOrModule, "Not Class or Module") def_exception(:ErrNotRegisteredException, "not registerd exception(%s)") end __ ..........................................石塚 圭樹@日本ラショナル... ----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---