迭代并设置Ruby对象实例变量
我正在寻找一种方法来迭代Ruby对象的实例变量,并使用通用setter单独设置它们(从提供的哈希)。 我假设我可以直接在方法中迭代它们并简单地单独设置它们。
这是我的对象实例,你:
u = #
我想用给定的哈希填充它,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 `' 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
设置它的instance_variables
。 这不难。
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