Posted at

rubyでcoffee scriptのコンストラクタみたいなもの

More than 5 years have passed since last update.

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>