組み込みクラスのすべてを移譲する(Ruby)

require 'delegate'

class MyArray < DelegateClass(Array)
  def initialize(*args, &bk)
    super(Array.new(*args, &bk))
  end
  
  def to_s
    join('_')
  end
end

a = MyArray.new(5) {rand(5)}
p a         #=>[4, 2, 3, 2, 4]
p a.to_s    #=>"4_2_3_2_4"

 
MyArray クラスは(リテラルがない以外)Array とまったく同様に使うことができます。新しいメソッドを作ったりインスタンス変数を定義したりしても、移譲なので、元の Array クラスにはまったく影響しません。