Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代并设置Ruby对象实例变量_Ruby_Setter_Instance Variables - Fatal编程技术网

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

迭代并设置Ruby对象实例变量,ruby,setter,instance-variables,Ruby,Setter,Instance Variables,我正在寻找一种迭代Ruby对象实例变量的方法,并使用通用setter(从提供的散列)单独设置它们。我假设我可以在一个方法中直接遍历它们,并简单地分别设置它们 这是我的对象实例u: u = #<Waffle:0x00007fc6b1145530 @id=nil, @alpha="", @bravo="", @charlie="", @delta=nil, @echo=nil, @status=new> 这是我的方法,它抛出了以

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

这是我的对象实例u:

u = #<Waffle:0x00007fc6b1145530 
    @id=nil,
    @alpha="",
    @bravo="",
    @charlie="",
    @delta=nil,
    @echo=nil,
    @status=new>
这是我的方法,它抛出了以下错误:

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)
回溯(最近一次呼叫最后一次):
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:'block in to_obj'中:没有将字符串隐式转换为整数(TypeError)
self.instance\u变量实际上是一个符号数组

我认为对象可以在给定哈希值的情况下设置其
实例变量。这不难

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
如果要仅在定义了该实例变量时设置值,请执行以下操作:

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

您需要
instance\u variable\u set
method您需要
instance\u variable\u set
method出于安全原因,我正在迭代对象的ivar,并根据散列进行相应的设置,而不是相反。Cheers@SergioTulentsev提供的散列可能大于我想要实际修改的实例变量数组。因此,如果我限定了实例变量,我只能设置这些变量,而不是让散列占据主导地位。@Stefan:是的,但是如果某个东西设置了一个“未知”的实例变量,它将不会被任何东西使用(除了基于反射的序列化或其他东西)。另外,这个质量分配是“不可预测的”(取决于对象中的哪些实例变量当前处于“活动”状态)@Rich\u F:如果您将“可设置”实例变量列为白名单(我们在这个线程中没有证据),那么是的。但在这种情况下,您也可以过滤哈希键。是白名单增加了安全性,而不是反转。@SergioTulentsev
instance_variables
似乎就是白名单。出于安全原因,我正在迭代对象的IVAR,并根据哈希进行相应的设置,而不是相反。Cheers@SergioTulentsev提供的散列可能大于我想要实际修改的实例变量数组。因此,如果我限定了实例变量,我只能设置这些变量,而不是让散列占据主导地位。@Stefan:是的,但是如果某个东西设置了一个“未知”的实例变量,它将不会被任何东西使用(除了基于反射的序列化或其他东西)。另外,这个质量分配是“不可预测的”(取决于对象中的哪些实例变量当前处于“活动”状态)@Rich\u F:如果您将“可设置”实例变量列为白名单(我们在这个线程中没有证据),那么是的。但在这种情况下,您也可以过滤哈希键。增加安全性的是白名单,而不是反转。@SergioTulentsev
instance_variables
似乎就是白名单。