2017-04-04 78 views
1

我有这个类:转换哈希PARAMS到实例变量上的Ruby初始化

class PriceChange 
    attr_accessor :distributor_id, :product_id, :value, :price_changed_at, :realm 

    def initialize(data = {}) 
    @distributor_id = data[:distributor_id] 
    @product_id  = data[:product_id] 
    @value   = data[:value] 
    @price_changed_at = data[:price_changed_at] 
    @realm   = data[:realm] 
    end 
end 

我想避免的方法体内的映射。 我想要一个透明和优雅的方式来设置实例属性值。 我知道我可以遍历数据键并使用类似define_method的东西。我不想要这个。 我想以一种干净的方式做到这一点。

回答

1

我想以干净的方式做到这一点。

您不会得到attr_accessor s和实例变量而不定义它们。下面是使用一些简单的元编程(是否有资格获得“干净”?)

class PriceChange 
    def initialize(data = {}) 
    data.each_pair do |key, value| 
     instance_variable_set("@#{key}", value) 
     self.class.instance_eval { attr_accessor key.to_sym } 
    end 
    end 
end 

用法:

price_change = PriceChange.new(foo: :foo, bar: :bar) 
#=> #<PriceChange:0x007fb3a1755178 @bar=:bar, @foo=:foo> 
price_change.foo 
#=> :foo 
price_change.foo = :baz 
#=> :baz 
price_change.foo 
#=> :baz 
+0

您的代码无疑是非常干净的,但正如我说:“我知道我可以遍历数据键并使用类似define_method的东西“。我正在寻找一种“透明”的方式。也许不存在。 – Leantraxxx

+1

@Leantraxxx它不存在,AFAICT –