重构这个直到声明更紧凑?

时间:2013-12-06 01:57:24

标签: ruby loops

除非循环,否则我有以下内容:

offset = 0
count = false
until count == 0
  offset += 100
  count = ThirdPartyApi.all(offset: offset)

  # Do other things within the loop
end

它的作用基本上是来自ThirdPartyApi.all的计数随着偏移量的增加而减少,一旦API调用中没有更多记录,就停止循环。

但整个街区感觉非常笨重。有没有办法重写,所以它更简洁?

2 个答案:

答案 0 :(得分:2)

编辑:由于你想在循环中做其他的陈述,这里有一个建议:

offset = 0
begin
  offset += 100
  count = ThirdPartyApi.all(offset: offset)

  # Do other things within the loop
end until count.zero?

这不会明显缩短,但是通过将测试置于循环的末尾,可以更清楚地表明它总是至少执行一次。这也使您不必初始化count

答案 1 :(得分:1)

假设您对count没有任何其他用途,可以将其减少为:

offset = 0
offset += 100 until ThirdPartyApi.all(offset: offset) == 0

更新:上述版本与OP的原始帖子不同,因为

<statement> until <expression>

在第一次评估<expression>之前执行语句,与

不同
begin
  ...
end until <expression>

在评估begin ... end子句之前执行until。 (请参阅http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745以获取matz关于此主题的有趣评论,由http://en.wikipedia.org/wiki/Ruby_(programming_language)引用。

鉴于修改后的问题表明OP希望在循环中执行额外的代码,除了@Matt的答案之外我没有什么可补充的(我要感谢他在原始答案中指出我的错误。)< / p>