为什么每个循环都不会破坏这个ruby?

时间:2013-04-10 07:02:29

标签: ruby loops break

我是编程的全新手,并通过Ruby使用Proj Euler。为什么这个红宝石循环不会破裂?

(1..5).each do |a|
  (1..5).each do |b|
    e=(a*a)+(b*b)
    c=Math.sqrt(e)
    puts "a=#{a}, b=#{b}, c=#{c}"
    break if a+b+c == 12
  end
end

请注意,如果我在if语句中添加任何其他内容(例如,如果a + b + c == 12,则将其设为“找到它”)它的工作正常,它就不会中断

3 个答案:

答案 0 :(得分:3)

这是正常的,因为您break上的循环只有b。 (循环继续a


此问题中描述了执行此操作的正确方法:How to break outer cycle in ruby

答案 1 :(得分:1)

以下代码可能是您想要做的事情

(1..5).each do |a|
  break unless (1..5).each do |b|
    e=(a*a)+(b*b)
    c=Math.sqrt(e)
    puts "a=#{a}, b=#{b}, c=#{c}"
    break if a+b+c == 12
  end
end

当在循环中触发break时,循环的返回值变为break值,在这种情况下为nil。在其他情况下,返回(1..5)。所以这段代码可行。

答案 2 :(得分:1)

正如其他人所说,break只会结束内循环。

您可以重写代码,例如:

[*1..5].product([*1..5]).map{|a, b| [a, b, Math.sqrt(a*a+b*b)]}.each do |a, b, c|
    puts "a=#{a}, b=#{b}, c=#{c}"
    break if a + b + c == 12
end

现在,break将按预期工作。