5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

学びや気づきの備忘録Advent Calendar 2023

Day 4

【Ruby Gold3.1詰まったシリーズ】undefの適応範囲

Last updated at Posted at 2023-12-03

はじめに

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でメソッドを打ち消す際は、継承チェーン上に存在する該当の全てのメソッドが打ち消されることがわかりました。もし誤っていたらご指摘いただけると助かります!

参考

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?