迭代并设置Ruby对象实例变量

时间:2018-02-08 08:58:36

标签: ruby setter instance-variables

我正在寻找一种方法来迭代Ruby对象的实例变量,并使用通用setter单独设置它们(从提供的哈希)。我假设我可以直接在一个方法中迭代它们并简单地单独设置它们。

这是我的对象实例,你:

u = #<Waffle:0x00007fc6b1145530 
    @id=nil,
    @alpha="",
    @bravo="",
    @charlie="",
    @delta=nil,
    @echo=nil,
    @status=new>

我想用给定的哈希填充它,h:

h = {
    "id"=>"141",
     "alpha"=>"Muccahiya""
     "bravo"=>"$2a$10$xR2g",
     "charlie"=>"2018-02-21 10:41:56-05",
     "delta"=>"2018-02-05 18:17:16.752606-05",
     "echo"=>"wobbly",
     "status"=>"active"
}

这是我的方法,它抛出了这个错误:

def to_obj(h)
    self.instance_variables.each do |i|
        self.i = h[i.sub('@','')]
    end
end

错误:

Traceback (most recent call last):
3: from /users/rich/app.rb:31:in `<main>'
2: from /Library/WebServer/Documents/dingbat/models/waffle.rb:240:in `to_obj'
1: from /Library/WebServer/Documents/dingbat/models/waffle.rb:240:in `each'
/Library/WebServer/Documents/dingbat/models/waffle.rb:241:in `block in to_obj': no implicit conversion of String into Integer (TypeError)

self.instance_variables确实是一个符号数组。

我认为对象可以设置其instance_variables给定哈希值。这可能很难。

1 个答案:

答案 0 :(得分:3)

def to_obj(h)
  h.each{|k, v| instance_variable_set("@{k}", v)}
end

如果只想在定义了这样的实例变量时设置一个值,那么执行:

def to_obj(h)
  h.each do
    |k, v|
    next unless instance_variable_defined?("@{k}")
    instance_variable_set("@{k}", v)
  end
end