在 Ruby 初始化器上将哈希参数转换为实例变量
Convert hash params into instance variables on Ruby initializer
我有这个class:
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
之类的东西。我不想要这个。 我想以干净的方式完成此操作。
I want to do this in a clean way.
如果不定义它们,您将不会获得 attr_accessor
s 和实例变量。下面是使用一些简单的元编程(是否符合"clean"?)
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
我有这个class:
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
之类的东西。我不想要这个。 我想以干净的方式完成此操作。
I want to do this in a clean way.
如果不定义它们,您将不会获得 attr_accessor
s 和实例变量。下面是使用一些简单的元编程(是否符合"clean"?)
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