Ruby Ruby 中的 do-while,bug 还是 feature?

redraiment · 2014年02月26日 · 最后由 kenshin54 回复于 2014年02月26日 · 3610 次阅读

忽然想到,Ruby 中有没有对应 C 语言里 do-while 的语法,即循环体至少执行一次。就尝试性地写了下面的代码:

begin
  puts "OK"
end while false

结果真的输出了一行“OK”!

接着把 while 换成 if:

begin
  puts "OK"
end if false

和期望的一样,什么都没有输出。

再试试去掉 begin end 的 while:

puts "OK" while false

同样什么都没有输出,看来 Ruby 对 begin end while 这样的语法做了特殊处理,虽然因此获得了类似 do while 的语句,但因此又多了一个“特例”,行为和其他的语句不统一。

单行 while 不是 do-while,就是普通 while 的单行写法。

#1 楼 @kenshin54 嗯,关键是看到whlieif对于begin end块的处理方式不一样,感觉有点不统一。

嗯,你观察真仔细,貌似就是变成了一种 do...while 的用法,我平时都是单行用,没这样玩过,确实有些让人一下子摸不着头脑

用得好的话,就是一个 feature:

You’ll come across a wrinkle when you use while and until as statement modifiers. If the statement they are modifying is a begin...end block, the code in the block will always execute at least one time, regardless of the value of the boolean expression:

#3 楼 @Cifer_Y 我是在用 net/http 去抓网页时,遇到需要 Redirect 的页面,然后就在想有没有类似 do-while 的语法,先获取一次,再判断是不是 Redirect,直到获取最终的页面。

#4 楼 @googya 嗯,知道以后就是一个 feature 了,如果不知道的话,就容易出 bug。

#5 楼 @hemslo 原来真有计划去除这个特性,哈。不过在 2.1.0 里面还没去除。

9 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号