18、Ruby 循环语句

很多情况下,我们可能需要重复的执行某些语句。我们把这些需要重复执行的语句称之为循环体。

循环体能否一直继续重复执行,决定循环的终止条件

循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。

循环语句是由循环体及循环的终止条件两部分组成的。

本章节将学习 Ruby 支持的所有循环语句

Ruby while 语句

while 语句语法格式如下

while conditional [do]  
   code1
end

或者

while conditional [:]  
   code
end

conditional 为真时,执行 code1

语法中do: 可以省略不写 但若要在一行内写出 while 式,则必须以 do 或 : 隔开条件式或程式区块

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

i = 1

while i < 5 do
   puts("在 while 循环语句中 i = #{i}" )
   i +=1
end

运行范例 »

运行以上范例,输出结果如下

$ ruby main.rb
在 while 循环语句中 i = 1
在 while 循环语句中 i = 2
在 while 循环语句中 i = 3
在 while 循环语句中 i = 4

Ruby while 修饰符

while 修饰符语法格式如下

statement while condition  

begin 
  statement  
end while condition  

conditional 为真时,执行 statement

如果 while 修饰符跟在一个没有 rescue 或 ensure 子句的 begin 语句后面, statement 会在 condition 判断之前执行一次。

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

i = 1

begin
   puts("在 while 修饰符循环语句中 i = #{i}" )
   i +=1
end while i < 5

运行范例 »

运行以上范例,输出结果如下

$ ruby main.rb
在 while 修饰符循环语句中 i = 1
在 while 修饰符循环语句中 i = 2
在 while 修饰符循环语句中 i = 3
在 while 修饰符循环语句中 i = 4

Ruby until 语句

until 语句语法格式

until conditiona [do]  
   statement
end

conditiona 为假时,执行 statement

语法中do 可以省略不写。但若要在一行内写出 until 式,则必须以 do 隔开条件式或程式区块

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

step = 6

until step > 10  do
   puts( "step = #{step}" )
   step += 1
end

运行范例 »

运行以上 Ruby 范例,输出结果如下

$ ruby main.rb
step = 6
step = 7
step = 8
step = 9
step = 10

Ruby until 修饰符

until 修饰符语法格式如下

statement until condition

begin
   statement
end until condition

condition 为 false 时,执行 statement

如果 until 修饰符跟在一个没有 rescue 或 ensure 子句的 begin 语句后面, statement 会在 condition 判断之前执行一次

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

step = 6

begin
   puts("step = #{step}" )
   step += 1

end until step  > 10

运行范例 »

运行以上 Ruby 范例,输出结果如下

$ ruby main.rb
step = 6
step = 7
step = 8
step = 9
step = 10

Ruby for 语句

for 语句语法格式如下

for variable [, variable ...] in expression [do]
   statement
end

先计算表达式 expression 得到一个对象,然后针对 expression 中的每个元素分别执行一次 statement

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

for step in 6..10   
    puts "step =  #{step}"
 end

运行范例 »

我们定义了范围 6..10。语句 for i in 6..10 允许 i 的值从 6 到 10(包含 10)

运行以上范例,输出结果如下

$ ruby main.rb
step =  6
step =  7
step =  8
step =  9
step =  10

for...in 循环几乎是完全等价于

(expression).each do |variable[, variable...]| code end

区别就是 for 循环不会为局部变量创建一个新的作用域

语法中do 可以省略不写。但若要在一行内写出 for 式,则必须以 do 隔开条件式或程式区块。

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

(6..10).each do |step|
    puts "step = #{step}"
 end

运行范例 »

运行以上范例,输出结果如下

$ ruby main.rb
step = 6
step = 7
step = 8
step = 9
step = 10

Ruby break 语句

break 语句用于终止 break 语句所在块的循环

break 语句语法格式如下

break

break 语句用于终止最内部的循环 如果在块内调用,则终止相关块的方法 ( 方法返回 nil )

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

for i in 7..15
    if i > 9 then
       break
    end
    puts "局部变量的值为 #{i}"
 end

运行范例 »

运行以上 Ruby 范例,输出结果如下

$ ruby main.rb
局部变量的值为 7
局部变量的值为 8
局部变量的值为 9

Ruby next 语句

next 语句用于跳过剩下的代码,开始进入下一个循环迭代

next 语句语法格式如下

next

next 语句用于跳到循环的下一个迭代。 如果在块内调用,则终止块的执行 (yield 表达式返回 nil)

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

for i in 0..3

    if i < 2 then
       next
    end
    puts "局部变量的值为 #{i}"    
end

运行范例 »

运行以上 Ruby 范例,输出结果如下

$ ruby main.rb
局部变量的值为 2
局部变量的值为 3

Ruby redo 语句

redo 语句用于重新开始 redo 所在代码块的循环迭代

redo 语句语法格式如下

redo

重新开始最内部循环的该次迭代,不检查循环条件 如果在块内调用,则重新开始 yieldcall

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

cnt = 0
for i in 0..3
    puts "局部变量的值为 #{i}"

    if i < 3 and cnt < 2 then
       cnt += 1
       redo
    end
end

puts "cnt = #{cnt}"

运行范例 »

运行以上 Ruby 范例,输出结果如下

$ ruby main.rb
局部变量的值为 0
局部变量的值为 0
局部变量的值为 0
局部变量的值为 1
局部变量的值为 2
局部变量的值为 3
cnt = 2

Ruby retry 语句

注意:1.9 以及之后的版本不支持在循环中使用 retry 语句

retry 语句语法格式

retry

如果 retry 出现在 begin 表达式的 rescue 子句中,则从 begin 主体的开头重新开始。

begin
   do_something   # 抛出的异常
rescue
   statement1     # 处理错误
   retry          # 重新从 begin 开始
end

如果retry 出现在迭代内、块内或者 for 表达式的主体内,则重新开始迭代调用。 迭代的参数会重新评估。

for i in 1..5
   retry if some_condition # 重新从 i == 1 开始
end

范例

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

for i in 1..5
   retry if  i > 2
   puts "局部变量的值为 #{i}"
end

运行以上范例,输出结果如下,并会进入一个无限循环

$ ruby main.rb
局部变量的值为 1
局部变量的值为 2
局部变量的值为 1
局部变量的值为 2
局部变量的值为 1
局部变量的值为 2
..........

可以使用 CTRL+C 组合键退出循环