在 Ruby 初始值设定项上将哈希参数转换为实例变量

Lea*_*xxx 3 ruby ruby-2.3

我有这门课:

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

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

And*_*eko 5

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

如果不定义它们,您将无法获得attr_accessors 和实例变量。下面使用一些简单的元编程(它符合“干净”的条件吗?)

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

用法:

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

  • @Leantraxxx 它不存在,AFAICT (2认同)