[ruby-list:37801] 動的に生成したクラスメソッドのundef

From: Ryuichiro Hara <r@...>
Date: 2003-06-19 05:46:18 UTC
List: ruby-list #37801
動的に生成したメソッドを除く方法を知りたく質問します。

class A
   def initialize
      eval('def foo; "foo"; end')
   end
   def bar
      "bar"
   end
   # undef_method :foo #=> これはエラーになる
                       #   こもっともです。
end

a = A.new
a.methods.include? 'foo' #=> true


このクラスのインスタンスレベルは、fooメソッドを持っているにもかか
わらず、クラスAの定義の中ではエラーになります。まぁ、もっともな感
じはしますが。

でも、このような動的に生成したメソッドを何とか後から削除する方法は
ないのでしょうか?


例えば一例、こんな場合です。


require 'cgi'
require 'cgi/sesion'
class MyCGI < CGI
   def initialize
      super "html4Tr"
      session = Session.new(self)
   end
   undef_method :fieldset #=> これはエラーになる
                          #   気持ち、これをやりたい
end

cgi = MyCGI.new
cgi = CGI::Session.new(cgi)
p cgi.form()


fieldsetメソッドがCGIクラスの中で動的に生成しますが、このfieldset 
という名のメソッドが定義されているか否かによってformブロック内に埋
め込まれるセッションIDを保持したhiddenフィールドの出力が変わります。
fieldsetが定義されているとMozillaで正しくレンダリングされない
<FIELDSET>...</FIELDSET>を出力してしまいます。

で、これを削除したいわけですが、現状ではもとのcgi.rbをいじって対処
しています。コーディングで対処できるといいのですが、いい方法はない
のでしょうか?

-- 
はらりゅう

In This Thread

Prev Next