如何在Ruby中进行迭代?

如何在Ruby中进行迭代?,ruby,Ruby,这个Ruby代码有什么问题?我正在努力解决这个问题 我认为问题出在sum+=num的语法上,但我不知道正确的语法应该是什么 sum = 0 num = 0 num2 = 0 loop do num += 1 if num % 3 == 0 sum += num break if num > 1000 end end loop do num2 += 1 if num2 % 5 == 0 sum += num2 break if num2

这个Ruby代码有什么问题?我正在努力解决这个问题

我认为问题出在
sum+=num
的语法上,但我不知道正确的语法应该是什么

sum = 0
num = 0
num2 = 0

loop do
  num += 1
  if num % 3 == 0
    sum += num
    break if num > 1000
  end
end

loop do
  num2 += 1
  if num2 % 5 == 0
    sum += num2
    break if num2 > 1000
  end
end

puts sum
你让这条路变得比需要的更复杂。此外,如果该数字是3和5的倍数,则它会被加两次。试着这样做:

sum = 0 # initialize the sum
(1...1000).each { |x| # loop from 1 to 1000
    sum += x if x % 3 == 0 || x % 5 == 0 # add the number to the sum if it is
                                         # divisible by 3 or 5
}
puts sum # output the sum
这里有一个替代方案:

(1...1000).select { |x| x % 3 == 0 || x % 5 == 0 }.reduce(:+)

这样运行时,您的语法是正确的,但没有给出正确的答案,因为如前所述,您将3和5的倍数添加两次,一次在第一个循环中使用
num
,另一次在第二个循环中使用
num2

所以有两个循环,但实际上只需要一个

你只需要考虑每个数字一次,你可以检查它,看看它是3或5的倍数。这将解决重复计算的问题,并使代码更加简洁

此外,如门把手所示,
每种
语法都会在这些循环中为您节省一些行。您还可以使用
for
语法:

for num in (1..1000)
  <stuff here>
end
(1..1000)中的num的

终止

查看“.”中的循环类型。

是否有任何数字可能会数到两次?没有问题。这是有效的Ruby代码。为什么要将
&:+
放在
reduce
中?我一直看到它是用
:+
完成的。请看这里:。嗯,是的,我知道它是做什么的,但是为什么不直接使用
:+
而不是
&:+
?它更简短,更容易理解,并且它删除了对
和\u proc
的不必要调用。您可能是对的。实际上是习惯的力量。正在执行的User.all.map(&:name)太多:我将编辑我的答案,以便更清楚。谢谢好吧,我只是想知道Ruby并不是我的主要语言:P