my_struct.rb

30分シリーズ、18。
Sturctクラスっぽいものを自前で作ってみよう。

このマニュアルから使い方を引用すると、

Dog = Struct.new(:name, :age)
fred = Dog.new("fred", 5)
fred.age=6
printf "name:%s age:%d\n", fred.name, fred.age  

とすると、"name:fred age:6"と出力する。

class MyStruct
  def self.new(*names)
    Class.new{|m|
      m.module_eval %Q{
        def initialize(*values)
          @values = values
        end
 
        def method_missing(name,*args)
          basename = get_name(name.to_s).to_sym
          if i = #{names.inspect}.index(basename) then
              if setter? name.to_s then
                @values[i] = args[0]
              else
                @values[i]
              end
          else
            super
          end
        end
        
        private
        def setter?(name)
          name[-1] == ?=
        end

        def get_name(name)
          if name[-1] == ?= then
            name[0...-1]
          else
            name
          end
        end
      }
    }
  end
end
 
Dog = Struct.new(:name, :age)
fred = Dog.new("fred", 5)
fred.age=6
printf "name:%s age:%d\n", fred.name, fred.age  
  • 親クラスを作ってそこに、毎回作る必要のない関数を移したい。setter?などを。
  • membersなどのメソッドは実装する時間がなかった
  • module_eval+%Qは相性良いなぁ