【小ネタ】Ruby の Struct の new を少し便利に。

More than 1 year has passed since last update.

Person = Struct.new(:name, :age, :height, :weight, :blood, :eye)

などとしたときに、Person.new の引数の順序を思い出すのが大変ってことありませんか。そんな時に、

Person = Struct.new(:name, :age, :height, :weight, :blood, :eye) do

def initialize(name: nil, age: nil, height: nil, weight: nil, blood: nil, eye: nil)
super(name, age, height, weight, blood, eye)
end
end

としておくと、keyword 引数で設定できます。

taro = Person.new(name: "Taro", blood: :A, eye: :black, height: 174)

=> #<struct Person name="Taro", age=nil, height=174, weight=nil, blood=:A, eye=:black>

という感じになります。


(追記)

より大胆に。


class Struct
alias _init initialize
def initialize(*args)
if instance_of?(Struct)
_init(*args)
else
keywords = Hash[*args]
members = members()
keywords.each_key do |key|
raise "illeagal key: #{key}" unless members.include?(key)
end
_init(*members.map(&keywords))
end
end
end

これで、いついかなる時でも、keyword 引数でしか使えなくなります。