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は相性良いなぁ