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

时间:2013-07-23 09:07:17

标签: 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

我如何更改 addOne() 实际执行其所说的内容?(在for循环中为所有变量添加1)

我猜for i in ...实际上包裹了一个i=@a,它在@a中创建了一个新的数字实例。但我认为我无法循环几个实例变量并将其更改到位。请注意,我的真正的课程显然更复杂。所以,是的,我确实希望循环变量。

2 个答案:

答案 0 :(得分:4)

%i[@a @b @c]
.each{|sym| instance_variable_set(sym, instance_variable_get(sym) + 1.0)}

答案 1 :(得分:2)

您的代码不起作用,因为表达式i += 1.0增加了局部变量i的值,而不是相关实例变量的值。为了使它工作,你可以做类似的事情:

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