[ruby-list:39058] undefの挙動

From: GOTO Naohisa <ngoto@...>
Date: 2004-01-20 16:22:59 UTC
List: ruby-list #39058
ngotoといいます。

Ruby 1.8.1にて以下のコードを実行すると NoMethodError になります。

% cat test.rb
class A  
  def a; 'a'; end
  def dummy; end
end
class B < A
  undef a, dummy
  def x; 'x'; end
  def dummy2; end
end
b = B.new
p b.x

% ruby test.rb 
test.rb:11: undefined method `x' for #<B:0x401b3d90> (NoMethodError)
% ruby --version
ruby 1.8.1 (2003-12-25) [i686-linux]

Ruby 1.6.7 ではエラーが出ず "x" を表示して正常終了します。
また、不思議なことに、 undef a, dummy を undef a だけにしたり、
クラス B の def dummy2; end の行を削除すると、エラーが出ません。

さらに、以下のようにメソッドを追加すると、
% cat test2.rb 
class A
  def a; 'a'; end
  def n; a;   end
  def dummy; end
end
class B < A
  undef a, dummy
  def x; 'x'; end
  def n; 'n'; end
  def dummy2; end
end
b = B.new
p b.n

% ruby test2.rb 
test2.rb:3:in `n': undefined local variable or method `a' for #<B:0x401b3b24> (NameError)
	from test2.rb:13

のように、クラス B でメソッドを上書き定義したはずなのに反映されません。

もしかすると、ここでは undef ではなくて undef_method を使うほうがよい?

-- 
後藤 直久  ngoto@gen-info.osaka-u.ac.jp

In This Thread

Prev Next