動的にクラスを作ってみたり、子供の頃に思いを馳せたり。

何だか自転車に乗りたい今日この頃。自転車に乗って子供の頃に登り切れなかった友人宅前の坂道を、大人の体力と財力を持って征服したくなったから、子供の頃の無駄ながむしゃらさを取り戻してみたくなったから、お前はいつから大人になったのだと三十路になってゴーストが囁いたから。
それはとりあえず置いておいて、動的にクラスを作ってみる。
動的にクラスを作る、始めて聞いたときはどうやってやるのか想像が付かなかったけど、こちらにバッチリなのがあったので、適当に簡単にアレンジして作ったみた。

#!/usr/bin/env ruby

class_name = 'Cat'
#クラスを作成
new_class = Object.const_set(class_name, Class.new)

fields = %w{ name sex }
values = %w{ tora male}

# クラスにフィールド、メソッドを追加
new_class.class_eval do
  attr_accessor *fields

  # コンストラクタを作成
  define_method(:initialize) do
    fields.each_with_index do |name, index|
      # インスタンスフィールドを作成し値を設定
      instance_variable_set('@' + name, values[index])
    end
  end

  define_method(:to_s) do
    ret = "#{self.class}:"
    # インスタンスフィールドを列挙
    instance_variables.each do |field|
      # instance_variable_getはインスタンスフィールドの値を取得
      ret << " #{field} = #{instance_variable_get(field)}"
    end
    return ret
  end

  define_method(:say_nyaaaa) do
    puts 'nyaaaaaaaaaaaaaaa'
  end

end

cat = Cat.new

puts cat.to_s
cat.say_nyaaaa

結果。

Cat: @name = tora @sex = male
nyaaaaaaaaaaaaaaa

おおおおおおおおお、本当に出来た。感動だ。
自転車買おう。