Powiel możliwe:
Idiomatic object creation in rubyWłączanie argumenty konstruktora do zmiennych instancji
Istnieje wiele okazjach, kiedy mam metodę initialize
, który wygląda tak:
class Foo
def initialize bar, buz, ...
@bar, @buz, ... = bar, buz, ...
end
end
Czy można to zrobić za pomocą prostej komendy, takiej jak:
class Foo
attr_constructor :bar, :buz, ...
end
, w którym symbole oznaczają nazwy zmiennych przykład (z duchem/smaku attr_accessor
, attr_reader
, attr_writer
)?
Zastanawiałem się, czy nie jest wbudowany w sposób lub bardziej elegancki sposób zrobić coś takiego:
class Class
def attr_constructor *vars
define_method("initialize") do |*vals|
vars.zip(vals){|var, val| instance_variable_set("@#{var}", val)}
end
end
end
tak, że można go używać tak:
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>
Czy chcesz zainicjować atrybuty podczas tworzenia? –
Myślę, że to pytanie zostało zadane wcześniej, ale nie znalazłem żadnych dokładnych duplikatów. –
@AndrewGrimm Dzięki za odniesienie do duplikatu pytania. Zobaczę tam odpowiedzi. Będę głosować, aby sam to zamknąć. – sawa