最好在代码中解释这个。鉴于此课程:
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
中创建了一个新的数字实例。但我认为我无法循环几个实例变量并将其更改到位。请注意,我的真正的课程显然更复杂。所以,是的,我确实希望循环变量。
答案 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