好久没有继续阅读 Ruby 了,我们今天就来一篇。今天啊,我们主要介绍 Ruby 中的 redo
关键字。
Ruby 中的 redo 关键字
redo
关键字主要有两个使用场景:
- 循环(loop) 和 枚举 (enumerations)中的
redo
- 块 ( block )中的
redo
循环和枚举中的 redo 关键字
Ruby 为循环和枚举的控制提供了很多关键字,比如:
- 用于停止并退出循环或枚举的
break
关键字。 - 用于停止当前迭代并进行下一次迭代的
next
关键字。 - 用于重新开始当前迭代或步骤的
redo
关键字。
你是不是有疑问,为什么没有 continue
关键字,哈哈,其实,next
就是其它语言中的 continue
关键字,而且比 continue
更形象不是。
其实,我更喜欢把每一次循环说成迭代 ( iteration ),而把每一次枚举说成步 ( step ) 。
当然了,本章节我们还是把焦点放在 redo
关键字上。
我们写一段代码来看看循环中如何使用 redo
关键字
demo.rb
for i in 1..3 do puts "Iteration #{i}" redo if i == 1 puts 'After redo' end
运行上面的结果,你会看到永无停止的输出,输出结果如下
[yufei@www.twle.cn java]$ ruby demo.rb Iteration 1 Iteration 1 Iteration 1 Iteration 1 .....infinite loop
从输出结果中我们可以看到,这个循环一直在输出 Iteration 1
。
这个无限输出都是 redo
的功劳,因为 redo if i == 1
这条语句的意思是,如果 i == 1
则重新执行当前循环。因此,首次迭代 i=1
就会一直不断的重复。
大家可以看到,输出结果中并没有 After redo
,这是因为每次迭代都没有执行到这一步,都被 redo if i == 1
拦截了,重新开始了当前迭代。
接下来我们把语句改改,在 redo if i == 1
之前加上一个 i++
语句,如下
demo.rb
for i in 1..3 do puts "Iteration #{i}" i += 1 redo if i == 1 end
运行上面的代码,输出结果如下
[yufei@www.twle.cn java]$ ruby demo.rb Iteration 1 Iteration 2 Iteration 2 Iteration 3
从输出结果中我们看到,并没有执行到 redo if i == 1
,因为上一条语句 i++
的缘故,此时 i
已经是 2
了。
当然了,这样做一点都没有的,一般情况下我们会在某条语句后使用 and
并添加 redo
来作为重做的条件,就像下面这样
for i in 1..3 do puts "Iteration #{i}" i += 1 and redo if i == 1 end
运行这段代码,运行结果如下
[yufei@www.twle.cn java]$ ruby demo.rb Iteration 1 Iteration 2 Iteration 2 Iteration 3
枚举中的 redo
枚举中的 redo
用法也是一样的。我们还是从一小段代码开始吧
demo.rb
[1,2,3].each do |n| puts "Step #{n}" n += 1 and redo if n < 2 end
运行结果如下
[yufei@www.twle.cn java]$ ruby demo.rb Step 1 Step 2 Step 2 Step 3
其实,Ruby 中的 redo
关键字有不仅仅可用于循环和迭代,还可以用于 块 ( block ) 中。
Ruby 块中的 redo
Ruby 中的块中也可以使用 redo
关键字。redo
关键字会使得从头开始重新运行块。
我们写一小段代码来演示下
demo
def hello yield end hello do puts 'hello' redo end
运行上面的代码,会看到永无止境的输出 hello
[yufei@www.twle.cn java]$ ruby demo.rb hello hello hello hello ... infinite loop
这时候的 redo
扮演的其实是循环的角色,在上面的代码中,是一个永远循环。
上面这个代码中,redo
关键字会将块重新运行作为 hello
方法的参数传递。
如果要停止的话,可以像循环中的 redo 那样添加条件。