2

最好在代码中解释这一点。给定这个类:

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 循环中的所有变量)

我猜想for i in ...实际上包装了 a i=@a,它在@a. 但是我看不出我可以遍历几个实例变量并就地更改它们。请注意,我的真实课程显然更复杂。所以,是的,我确实想遍历变量。

4

2 回答 2

4
%i[@a @b @c]
.each{|sym| instance_variable_set(sym, instance_variable_get(sym) + 1.0)}
于 2013-07-23T09:13:27.070 回答
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
于 2013-07-23T09:13:40.480 回答