Rubyのインスタンス変数と継承についての勘違い

こんにちは!

今回はRubyインスタンス変数と継承の動作について基本的なところで勘違いをしていたので、まとめたいと思います。

コード

class Box
  def initialize
    @item = 'apple'
  end
  
  def item
    @item
  end

  def input(item)
    @item = item
  end
end

class BigBox < Box
end

box = Box.new
bigbox = BigBox.new

box.input('banana')

puts box.item
puts bigbox.item

想定していた結果(誤り)

box = Box.new -> 'apple'
bigbox = BigBox.new -> 'apple'

puts box.item -> 'banana'
puts bigbox.item -> 'banana'

実際の結果

box = Box.new -> 'apple'
bigbox = BigBox.new -> 'apple'

puts box.item -> 'banana'
puts bigbox.item -> 'apple'

勘違いの理由

  • 子でオーバーライドしていないメソッドは、親のメソッドが使われるため、インスタンス変数についても親のインスタンス変数が参照されると勘違いしていた
  • クラスが設計図、インスタンスが実体というイメージから考えれば当たり前

おわりに

わかっているつもりでわかっていなかったので、早めに気づいてよかったです。実際にプログラムを書いているときにひっかかってしまったので、まとめてみました。

7/100