Ruby 在实例变量上循环,如何更改它们?

Ruby 在实例变量上循环,如何更改它们?,ruby,Ruby,这一点最好用代码来解释。鉴于这一类别: class Simple def initialize @a, @b, @c = 0.0, 0.0, 0.0 end attr_accessor :a, :b, :c def addOne() for i in [@a, @b, @c] do i += 1.0 end end end s = Simple.new s.addOne() puts s.a # outputs 0.0 如何更改addOn

这一点最好用代码来解释。鉴于这一类别:

class Simple
  def initialize
    @a, @b, @c = 0.0, 0.0, 0.0
  end
  attr_accessor :a, :b, :c
  def addOne()
    for i in [@a, @b, @c] do
      i += 1.0
    end
  end
end
s = Simple.new
s.addOne()
puts s.a
# outputs 0.0
如何更改
addOne()
以实际执行它所说的操作?(将1添加到for循环中的所有变量)


我猜…中I的
实际上包装了一个
I=@a
,它在
@a
中创建了一个新的数字实例。但我看不出有什么办法可以循环几个实例变量,并在适当的地方修改它们。请注意,我真正的类显然更复杂。因此,是的,我确实想循环变量。

您的代码不起作用,因为表达式
I+=1.0
增加局部变量
I
的值,而不是相关实例变量的值。要使其发挥作用,您可以执行以下操作:

%i[@a @b @c]
.each{|sym| instance_variable_set(sym, instance_variable_get(sym) + 1.0)}
class Simple
  # ...
  def add_one
    [:a, :b, :c].each { |v| send("#{v}=", send(v) + 1.0) }
  end
end

s = Simple.new
s.add_one
puts s.a
# => 1.0

非常快。:-)%i在数组前面做什么?对于ruby 1.9.3,这对我来说是行不通的。它报告@a的未知字符串类型。有什么线索吗?它只适用于ruby 2.0。对于1.9,改为
[:@a,:@b,:@c]
。sawa的答案在我看来更直接,但我喜欢这个答案,因为它将对访问器进行任何其他抽象(考虑到OP已经提供了访问器)。