はじめに
Ruby Gold3.1の勉強で詰まった箇所が幾つかあったため、シリーズ化してみます。今回はundefに関する内容です。undefでメソッドを打ち消す際、継承チェーン上で一番最初にヒットしたメソッドのみが打ち消されると理解していましたがそうではないらしいです。
irbで確認してみた
環境はruby2.5.3です。
SuperClsを継承したSubClsにModモジュールをmixinした
module Mod
def hoge
puts "Mod"
end
end
class SuperCls
def hoge
puts "SuperCls"
end
end
class SubCls < SuperCls
include Mod
undef hoge
end
を実行する。
一番最初にヒットしたメソッド(Modモジュールのhogeメソッド)のみが打ち消される想定だったので、
SubCls.new.hoge
を実行するとSuperClsのhogeメソッドが呼び出されSuperClsが表示されると思っていましたが、
irb(main):018:0> SubCls.new.hoge
Traceback (most recent call last):
2: from /usr/local/bin/irb:11:in `<main>'
1: from (irb):18
NoMethodError (undefined method `hoge' for #<SubCls:0x0000557ef1be3d70>)
NoMethodErrorとなりSuperClsのhogeメソッドも打ち消されているようです。
おわりに
確認した結果、undefでメソッドを打ち消す際は、継承チェーン上に存在する該当の全てのメソッドが打ち消されることがわかりました。もし誤っていたらご指摘いただけると助かります!
参考