有很多occaisions時,我有一個initialize
方法,看起來像這樣:
class Foo
def initialize bar, buz, ...
@bar, @buz, ... = bar, buz, ...
end
end
是有一種方法可以通過一個簡單的命令來實現,如:
class Foo
attr_constructor :bar, :buz, ...
end
其中符號表示實例變量的名稱(用attr_accessor
,attr_reader
,attr_writer
精神/味)?
我想知道是否有一個內置的方式或做這樣的事情的一個更優雅的方式:
class Class
def attr_constructor *vars
define_method("initialize") do |*vals|
vars.zip(vals){|var, val| instance_variable_set("@#{var}", val)}
end
end
end
,這樣我可以這樣使用它:
class Foo
attr_constructor :foo, :bar, :buz
end
p Foo.new('a', 'b', 'c') # => #<Foo:0x93f3e4c @foo="a", @bar="b", @buz="c">
p Foo.new('a', 'b', 'c', 'd') # => #<Foo:0x93f3e4d @foo="a", @bar="b", @buz="c">
p Foo.new('a', 'b') # => #<Foo:0x93f3e4e @foo="a", @bar="b", @buz=nil>
你想在創建過程中初始化屬性嗎? –
我認爲這個問題以前曾被問過,但我還沒有找到任何確切的重複。 –
@AndrewGrimm感謝您提及重複的問題。我會在那裏看到答案。我會投票自己關閉這個。 – sawa