Stonefishy Blog - by Andrew Shi

Scribbles of a front and back ends developer

Ruby修炼之道(4)

循环

对于任何一种程序设计语言,都有循环处理的方法,Ruby也一样,但是在Ruby中有两种实现循环的方法。

  • 使用循环语句,即利用Ruby提供的现有循环语句
  • 使用方法实现循环,其具体做法为,将块传给方法,然后在块里面写上需要循环的处理。

在Ruby中,有6种循环语句或方法:

  • times方法
  • while语句
  • each方法
  • for语句
  • until语句
  • loop方法

times方法 用于已知道执行的次数,具体用法如下:

循环次数.times do
    逻辑处理
end

#do ~ end部分可以用 { ~ }代替.

循环次数.times {
    逻辑处理
}
times方法
1
2
3
4
>> 3.times do
>>       print "hello "
>> end
hello hello hello => 3             #=> 打印3个hello,并返回循环次数

如果想知道当前的循环次数,则需要添加一个当前的循环次数变量:

循环次数.times do |i|
    逻辑处理
end
带循环次数的times方法
1
2
3
4
>> 3.times do |i|
>>       print "hello#{i} "
>> end
hello0 hello1 hello2 => 3          #=> 打印3个带有当前第几次循环的hello,并返回循环次数

注:times方法会返回循环次数

for语句times方法不同,for并不是方法,而是循环控制语句。

for 变量 in 开始时的数值..结束时的数值 do
    循环处理
end

#遍历对象的for语句
for 变量 in 对象 do
    循环处理
end

for语句的循环开始值和结束值可以任意指定。

for语句
1
2
3
4
5
6
7
8
9
10
11
>> for i in 1..3
>>       print "hello "
>> end
hello hello hello => 1..3            #=> 打印3个hello,返回1..3的range


>> language = ["Python", "Javascript", "Ruby"]
>> for lan in language
>>       print "#{lan} "
>> end
Python Javascript Ruby => ["Python", "Javascript", "Ruby"]            #=> 一次打印数组中的元素,并返回数组

注:..或者…都是创建范围对象时所需的符号

while语句 之前了解到,语法如下,十分简单

while 条件 do
    循环处理
end
while语句
1
2
3
4
5
6
>> i, sum = 1, 0
>> while sum < 50 do
>>       sum += i
>>       i += 1
>> end
>> puts sum                   #=> 55

until语句while语句刚刚相反,until语句不满足条件时才执行循环处理,知道条件满足终止。

until 条件 do
    循环处理
end
until语句
1
2
3
4
5
6
>> i, sum = 1, 0
>> until sum >=50 do
>>       sum += i
>>       i += 1
>> end
>>  puts sum                  #=> 55

each方法 each方法将对象集合里的对象逐个取出,这与for语句循环取出数组元素非常相似。

对象.each do |变量|
    循环处理
end

#与下面的for语句处理一样
for 变量 in 对象
    循环处理
end
each方法
1
2
3
4
5
>> language = ["Python", "Javascript", "Ruby"]
>> language.each do |lan|
>>       print "#{lan} "
>> end
Python Javascript Ruby => ["Python", "Javascript", "Ruby"]            #=> 返回对象

注:在Ruby内部,for语句是用each方法来实现的。可以使用each方法的对象,也可以用for语句

loop方法 此循环方法没用终止循环条件,需要用得循环控制语句来控制此循环

loop do
    循环处理
end

循环控制命令

  • break 终止程序,跳出循环
  • next 跳到下一次循环,和其他类似Java,C#的continue一样
  • redo 在相同的条件下重复刚才的处理

redonext非常像,与next的不同之处是,redo会再执行一次相同的循环。所以要注意redo的使用方法,很容易陷入死循环中。

*注: do ~ end{ ~ } 是等价的语句块。 只不过从编码规范上来说,如果程序是跨行写的时候使用do ~ end,程序写在1行的时候用{ ~ }.

1
2
3
4
5
>> 3.times do |i|
>>       puts i
>> end

>> 3.times { |i| puts i }