オブジェクト指向応用レベル
次のプログラムを実行すると何が表示されますか?
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.new は initialize を定義していないため、追加の変化は起きません。
この問題のポイントは3つあります。①クラス定義の中のコードは、その場で実行されること。② class << self の中のコードも、その場で実行されること。③定数 ITEMS は配列オブジェクトへの参照であり、<< はその配列自体を変更する破壊的操作であることです。そのため、push_item を呼ぶたびに同じ Object::ITEMS に要素が追加され、最終的な要素数は 4 になります。