我正在寻找一种方法来迭代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
给定哈希值。这可能很难。
答案 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