一个Ruby块的执行流可与被控制break,next和redo语句。
该break语句将立即退出该块。该块中所有剩余的指令将被跳过,并且迭代将结束:
actions = %w(run jump swim exit macarena) index = 0 while index < actions.length action = actions[index] break if action == "exit" index += 1 puts "Currently doing this action: #{action}" end # 当前正在执行此操作:运行 # 当前正在执行此操作:跳转 # 当前正在执行此操作:游泳
该next语句将立即返回到该块的顶部,并进行下一次迭代。该块中所有剩余的指令将被跳过:
actions = %w(run jump swim rest macarena) index = 0 while index < actions.length action = actions[index] index += 1 next if action == "rest" puts "Currently doing this action: #{action}" end # 当前正在执行此操作:运行 # 当前正在执行此操作:跳转 # 当前正在执行此操作:游泳 # 当前正在执行此操作:macarena
该redo语句将立即返回到该块的顶部,然后重试相同的迭代。该块中所有剩余的指令将被跳过:
actions = %w(run jump swim sleep macarena) index = 0 repeat_count = 0 while index < actions.length action = actions[index] puts "Currently doing this action: #{action}" if action == "sleep" repeat_count += 1 redo if repeat_count < 3 end index += 1 end # 当前正在执行此操作:运行 # 当前正在执行此操作:跳转 # 当前正在执行此操作:游泳 # 当前正在执行此操作:睡眠 # 当前正在执行此操作:睡眠 # 当前正在执行此操作:睡眠 # 当前正在执行此操作:macarena
除了循环外,这些语句还可以使用Enumerable迭代方法,例如each和map:
[1, 2, 3].each do |item| next if item.even? puts "Item: #{item}" end # 项目:1 # 项目:3
在break和next语句中,可能会提供一个值,并将其用作块结果值:
even_value = for value in [1, 2, 3] break value if value.even? end puts "The first even value is: #{even_value}" # 第一个偶数值为:2