将构造函数参数转换为实例变量

saw*_*awa 7 ruby

可能重复:
在ruby中创建惯用对象

当我有一个如下所示的initialize方法时,有很多次:

class Foo  
    def initialize bar, buz, ...
        @bar, @buz, ... = bar, buz, ...
    end
end
Run Code Online (Sandbox Code Playgroud)

有没有办法用一个简单的命令来做到这一点,如:

class Foo
    attr_constructor :bar, :buz, ...
end
Run Code Online (Sandbox Code Playgroud)

其中,符号表示实例变量的名称(与精神/风味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
Run Code Online (Sandbox Code Playgroud)

所以我可以像这样使用它:

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>
Run Code Online (Sandbox Code Playgroud)

Moi*_*aja 2

这对你有用吗?

class Foo  
    def initialize(hash)
        hash.each { |k,v| instance_variable_set("@#{k}", v) }
    end
end
Run Code Online (Sandbox Code Playgroud)