使用hash设置实例变量

时间:2018-03-01 20:01:21

标签: ruby instance-variables

我试图设置实例变量而不用单个setter打孔我的对象。我想使用我称之为群组设置器的方法来执行此操作。

我想迭代一个对象instance_variables,对于那些与预先提供的哈希中的键匹配的对象,请使用instance_variable_set单独设置它们。我不想迭代哈希对来限定实例变量的设置,因为这是一个安全问题。

这是我的代码:

class Pickle
  attr_accessor :id, :name, :colour, :status

  def initialize()
    @id = nil
    @name = nil
    @colour = 'green'
    @status = 'new'
  end

  def into_me(incoming)
    instance_variables.each do |i|
      puts i
      puts incoming[i]
      instance_variable_set(i, incoming[i])
    end
  end
end

a = Pickle.new
# >> @id
# => #<Pickle:0x00007fef6782c978 @colour="green", @id=nil, @name=nil, @status="new">

newstuff = {:name => 'Peter', :colour => 'red'}
a.into_me(newstuff)
# >> @name
# >> @colour
# >> @status
# => #<Pickle:0x00007fef6782c978 @colour=nil, @id=nil, @name=nil, @status=nil>

它很接近,但它似乎无法在哈希中找到提供的键/值对。我不明白为什么它不能使用提供的哈希来查找符号作为键。

我做错了什么?

由于instance_variable变量类型不匹配,因此之前没有重复和回答。如果您阅读帖子,请说It's close, but it can't seem to find the provided key/value pair in the hash. I don't see why it can't use the provided hash to look up symbols as keys.

1 个答案:

答案 0 :(得分:0)

我这样做的一种方法是翻转分配,例如。

def initialize(**h)
    h.each do |k, v|
        setter = "#{k}="
        next unless respond_to? setter # skip if we don't have a setter for this key
        public_send setter, v
    end
end

这将处理传入的哈希,并为哈希中找到的每个哈希调用赋值操作。它将跳过没有显式设置器的任何值。