在 Ruby 中,我应该使用控制流来初始化循环内的累加器吗?
In Ruby, should I use control flow to initialize an accumulator inside a loop?
像这样初始化累加器是好习惯吗?
100.times do
@accumulator = (@accumulator || 0) + 1
end
或者我应该在循环外初始化它并执行:
@accumulator = 0
100.times do
@accumulator += 1
end
我喜欢第二个。但是如果你正在寻找 .times 方法的累加器,你可以使用
100.times do |accumulator|
p accumulator
end
与你的例子唯一不同的是你有一个对象属性作为累加器,所以如果你需要那个属性供后面的使用,你可以做这样的事情
100.times do |c|
@accumulator = c
end
为了直接回答你的问题,我通常会在循环外进行初始化。
但是,我认为最佳做法是以块形式使用高阶函数,这样就不需要显式循环。
@accumulator = 100.times.reduce do |memo, element|
memo + element
end
或者,在这种情况下,您甚至可以使用一个符号来指定方法:
@accumulator = 100.times.reduce(:+)
这会将“+”方法依次应用于每一对。
http://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-reduce
像这样初始化累加器是好习惯吗?
100.times do
@accumulator = (@accumulator || 0) + 1
end
或者我应该在循环外初始化它并执行:
@accumulator = 0
100.times do
@accumulator += 1
end
我喜欢第二个。但是如果你正在寻找 .times 方法的累加器,你可以使用
100.times do |accumulator|
p accumulator
end
与你的例子唯一不同的是你有一个对象属性作为累加器,所以如果你需要那个属性供后面的使用,你可以做这样的事情
100.times do |c|
@accumulator = c
end
为了直接回答你的问题,我通常会在循环外进行初始化。
但是,我认为最佳做法是以块形式使用高阶函数,这样就不需要显式循环。
@accumulator = 100.times.reduce do |memo, element|
memo + element
end
或者,在这种情况下,您甚至可以使用一个符号来指定方法:
@accumulator = 100.times.reduce(:+)
这会将“+”方法依次应用于每一对。
http://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-reduce