ZetCode

Ruby next 关键字

最后修改日期:2025 年 4 月 27 日

本教程解释了如何使用 Ruby 的 next 关键字。这个流程控制语句在循环和代码块中跳到下一个迭代。

next 关键字会立即跳转到循环的下一个迭代。它会跳过当前迭代中任何剩余的代码。在代码块中,它将控制权返回给调用它的方法。

next 对于过滤元素或跳过无效数据很有用。它可以选择性地传递一个值以从代码块中返回。多个条件可以触发不同的跳过行为。

循环中的基本 next

这个简单的例子演示了在循环中跳过偶数。当触发时,next 语句会跳到下一个迭代。

basic_next.rb
(1..10).each do |i|
  next if i.even?
  puts "Processing odd number: #{i}"
end

循环处理 1 到 10 的数字。当 i.even? 为真时,next 会跳过 puts 语句。只有奇数会被打印。

带有值的代码块中的 next

next 可以将一个值从代码块返回给调用它的方法。这个例子展示了如何在跳过某些数字的同时转换它们。

next_with_value.rb
result = (1..5).map do |n|
  next n * 10 if n.odd?
  n
end

puts result.inspect # [10, 2, 30, 4, 50]

奇数乘以 10 并通过 next 返回。偶数则直接返回其原始值。结果结合了这两种情况。

跳过嵌套循环

next 只影响最内层的循环。这个例子展示了带有条件跳过的嵌套循环。

nested_loops.rb
(1..3).each do |i|
  puts "Outer loop: #{i}"
  
  ('a'..'c').each do |j|
    next if i == 2 && j == 'b'
    puts "  Inner loop: #{j}"
  end
end

i 为 2 且 j 为 'b' 时,next 只会跳过内层循环的 puts。外层循环不受影响地继续。

while 循环中的 next

nextwhile 循环中的作用与迭代器类似。这个例子在满足条件时跳过处理。

while_loop.rb
count = 0
while count < 5
  count += 1
  next if count == 3
  puts "Count is #{count}"
end

循环在每次迭代中增加 count。当 count 等于 3 时,next 会跳过 puts 语句。所有其他值都会被打印。

带有多个子句的条件 next

多个条件可以触发 next 并产生不同的行为。这个例子展示了复杂的过滤逻辑。

conditional_next.rb
(1..20).each do |num|
  next puts "Skipping #{num}: too small" if num < 5
  next puts "Skipping #{num}: multiple of 5" if num % 5 == 0
  next if num.even?
  
  puts "Processing odd number #{num} (5-20, not multiple of 5)"
end

小于 5 的数字、5 的倍数和偶数都会被跳过。每种情况都有不同的输出行为。只有符合条件的奇数会被处理。

方法代码块中的 next

next 在传递给方法的代码块中使用时,它会将控制权返回给方法。这个例子演示了这种行为。

method_block.rb
def process_items
  yield(1)
  puts "After first yield"
  yield(2)
  puts "After second yield"
  yield(3)
end

process_items do |i|
  next if i == 2
  puts "Processing #{i}"
end

输出显示,当触发 next 时,控制权会返回到方法。 "Processing 2" 消息被跳过,但方法的执行会继续。

代码块中的 next 与 return 对比

这个例子对比了代码块中的 nextreturnnext 只退出代码块,而 return 则退出包含它的方法。

next_vs_return.rb
def test_next
  [1, 2, 3].each do |i|
    next if i == 2
    puts "next: #{i}"
  end
  puts "After next block"
end

def test_return
  [1, 2, 3].each do |i|
    return if i == 2
    puts "return: #{i}"
  end
  puts "This won't print"
end

test_next
test_return

next 只跳过迭代 2,然后继续。return 在迭代 2 时退出整个方法。最后的 "This message appears only in test_next." 消息只在 test_next 中出现。

来源

Ruby 关键字文档

本教程涵盖了 Ruby 的 next 关键字,并通过示例展示了循环控制、代码块行为以及与其他流程控制语句的比较。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了超过 1400 篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出 所有 Ruby 教程