CoffeeScriptのコンストラクタは名前に@をつけるだけでプロパティへの代入もしてくれる.それをrubyで組んでみた
class Class
def instance_vars(*vars)
class_eval <<-EOS
alias initialize_ initialize
def initialize(*args)
#{ vars.inject(""){|code, var| code << "@#{var} = args.shift;" }}
initialize_(*args)
end
EOS
end
end
class_eval
のブロックを渡したら、initialize内でvarsが使えなかったので文字列にした。
使い方
class Pair
attr_accessor :key, :val
instance_vars :key, :val
end
pair = Pair.new(:hoge, 'aaa')
p pair #=> #<Pair:0x00000000defe90 @key=:hoge, @val="aaa">
initialize
を使うことも出来るが、instance_vars
を後ろに置かなければいけないのが難点。
class Person
def initialize(upcase = false)
@name.upcase! if upcase
end
instance_vars :name, :age, :sex
end
person = Person.new('John', 20, :male, true)
p person #=> #<Person:0x00000001a3ec50 @name="JOHN", @age=20, @sex=:male>