Ruby 有两种实现循环的方法
- 使用循环语句(for、while、until)
- 使用方法实现循环(times、each、loop)
times 方法
7.times do
puts "满地油菜花"
end
# do...end 可以用 {} 替代
7.times {
puts "满地油菜花"
}
# 从 0 开始
5.times do |i|
puts "第 #{i} 次的循环"
end
for 语句
for 变量 in 开始时的数值..结束时的数值 do
希望循环的处理
end
# 可以省略 do
# 并非任何对象都可以指定给 for 语句使用
for 变量 in 对象 do
希望循环的处理
end
sum = 0
for i in 1..5 do
sum = sum + i
end
puts sum
# ========================
names = [ "awk", "Perl", "Python", "Ruby" ]
for name in names do
puts name
end
while 语句
while 条件 do
希望循环的处理
end
# 可以省略 do
i = 1
while i < 3 do
puts i
i += 1
end
sum = 0
i = 1
while i <= 5 do
sum += i
i += 1
end
puts sum
until 语句
until 与 while 语句判断的条件是相反的,这与 if 语句跟 unless 语句一样,不满足条件才执行循环体
until 条件 do
希望循环的处理
end
sum = 0
i = 1
until sum >= 50 do
sum += i
i += 1
end
puts sum
# ! 也能达到 until 的效果
sum = 0
i = 1
while !(sum >= 50) do
sum += i
i += 1
end
puts sum
虽然可以使用 while 语句的否定形式代替 until 语句。但是,有时对一些比较复杂 的条件表达式使用否定,反而会不直观,影响程序理解,在这种情况下,我们应该考虑使用 until 语句。
each 方法
each 方法将对象集合中的对象逐个取出
对象.each do |变量|
希望循环的处理
end
对象.each { |变量|
希望循环的处理
}
# 上面等效于
for 变量 in 对象 do
希望循环的处理
end
names = [ "awk", "Perl", "Python", "Ruby" ]
names.each do |name|
puts name
end
# or
names = [ "awk", "Perl", "Python", "Ruby" ]
names.each {|name|
puts name
}
在 Ruby 内部,for 语句是用 each 方法来实现的,因此,可以使用 each 方法的对象,同样也可以指定为 for 语句的循环对象。
sum = 0
(1..5).each do |i|
sum += i
end
puts sum
loop 方法
没有终止循环条件,会不断地执行循环处理
loop do
print "Ruby"
end
循环控制
循环控制命令
- break:终止程序,跳出循环
- next:跳到下一次循环
- redo:在相同条件下重复刚才的过程,一般很少用
puts "break 的例子:"
i = 0
["Perl", "Python", "Ruby", "Scheme"].each do |lang|
i += 1
if i == 3
break
end
p [i, lang]
end
puts "next 的例子:"
i = 0
["Perl", "Python", "Ruby", "Scheme"].each do |lang|
i += 1
if i == 3
next
end
p [i, lang]
end
输出

next 类似 C 中 continue,没什么好说的,只管上例子
pattern = Regexp.new(ARGV[0])
filename = ARGV[1]
max_matches = 10
matches = 0
file = File.open(filename)
file.each_line do |line|
if matches >= max_matches
break
end
if pattern =~ line do
matches += 1
puts line
end
end
file.close
各种循环语句、方法使用场景
- times 方法:确定了循环次数时使用
- for 语句:从对象取出元素时使用(each 语法糖)
- while 语句:希望自由指定循环条件时使用
- until 语句:使用 while 语句使循环条件变得难懂时使用
- each 方法:从对象中取出元素时使用
- loop 方法:不限制循环次数时使用
拓展:do ~ end 与 {~}
跨行写程序时使用 do ~ end
程序写在一起使用 { ~ }
10.times do |i|
puts i
end
# 或者
10.times {|i| puts i}