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