Ruby 中的 redo 关键字

yufei       6 年, 2 月 前       1055

好久没有继续阅读 Ruby 了,我们今天就来一篇。今天啊,我们主要介绍 Ruby 中的 redo 关键字。

Ruby 中的 redo 关键字

redo 关键字主要有两个使用场景:

  1. 循环(loop) 和 枚举 (enumerations)中的 redo
  2. 块 ( 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 那样添加条件。

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.