オブジェクト指向応用レベル

次のプログラムを実行すると何が表示されますか?

class Object
  ITEMS = []
  def push_item
    ITEMS << :x
  end
end

class Alpha
  push_item
  class << self
    push_item
  end
end

class Beta
  push_item
  def initialize
    push_item
  end
end

Alpha.new
Beta.new

p Object::ITEMS.size
  • 12
  • 23
  • 34
  • 45

解説

push_item が呼ばれるタイミングを順に追うと、① Alpha のクラス定義本体、② class << self ブロック内、③ Beta のクラス定義本体、④ Beta.new による initialize 実行の計4回です。Alpha.newinitialize を定義していないため、追加の変化は起きません。

この問題のポイントは3つあります。①クラス定義の中のコードは、その場で実行されること。② class << self の中のコードも、その場で実行されること。③定数 ITEMS は配列オブジェクトへの参照であり、<< はその配列自体を変更する破壊的操作であることです。そのため、push_item を呼ぶたびに同じ Object::ITEMS に要素が追加され、最終的な要素数は 4 になります。

問題一覧へ戻る