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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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
重新开始最内部循环的该次迭代,不检查循环条件 如果在块内调用,则重新开始 yield 或 call
范例
# !/usr/bin/ruby -w # -*- encoding:utf-8 -*- # filename: main.rb # author: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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: 简单教程(www.twle.cn) # Copyright © 2015-2065 www.twle.cn. 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
组合键退出循环