Ruby中的redo&retry

2016-12-03 14:06:41来源:网络收集作者:一线码农人点击

第七城市
redo

ruby中的redo有点像C中的continue,意为略过循环中redo之后的代码,重新执行循环。


for i in 0..9
puts "Befor redo #{i}"
redo if i == 5
puts "After redo #{i}"
end

上面这段代码的执行结果为

Befor redo 0
After redo 0
Befor redo 1
After redo 1
Befor redo 2
After redo 2
Befor redo 3
After redo 3
Befor redo 4
After redo 4
Befor redo 5
Befor redo 5
Befor redo 5
Befor redo 5

后面就陷入了死循环中,也就是说redo并不会执行for循环中的递加。要达到跳过5的目的,可以用while来改写。

i = 0
while i < 9
i += 1
redo if i == 5
printf %d,i
end

上面这段代码的执行结果为12346789确实略过了5。当然如果非要用for的话,也可以把redo写在if块里。

for i in 0..9
puts "Befor redo #{i}"
if i == 5
i += 1
redo
end
puts "After redo #{i}"
end
print "/n"

这样看来,redo的用途比较明显,就是我们在处理一串数据时,如果想要使这串数据里的一些数据不被处理,就可以使用redo。


retry

Ruby1.9之前,retry可以像redo一样用法,但在Ruby1.9之后,retry只能用于异常处理。如果retry没有被包含在rescue中,执行器就会报错。

c = 0
begin
puts "start"
for i in 0..9
if i == 5 and c == 0
raise "c can't be zero"
end
printf "%d" ,i
end
rescue
c += 1
print "/n"
retry
end

上面这段代码用rasie手工抛出一个异常,执行的结果为

start
01234
start
0123456789

可以看到,retry会使程序从begin开始重新执行程序块。所以retry的用途是针对执行时的异常作出补救反应,使程序得以继续运行下去。比如一个简单的除0错误

a = 0
begin
b = 1 / a
end

上面这段代码运行时会报错

in `/’: divided by 0 (ZeroDivisionError)

要防止这种情况发生,可以写一个异常处理机制

a = 0
begin
b = 1 / a
rescue ZeroDivisionError
a += 1
retry
ensure
p b
end

这样,可以发现程序被顺利执行了,处理后b的值为1。

版权声明:本文为博主原创文章,未经博主允许不得转载。

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台