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}