为什么`loop`不是关键字?没有块的`loop`的用例是什么?

时间:2015-08-31 05:37:25

标签: ruby loops keyword

我想知道为什么- (NSDictionary *)stateMergedWith:(NSDictionary *)state forObjects:(NSArray *)objects { NSMutableDictionary *mutableState = [([self state]?: @{}) mutableCopy]; loop方法,而不是像Kernelwhile这样的关键字。在某些情况下我想进行无条件循环,但由于作为方法的untilloop慢,所以当性能很重要时,我选择执行后者。但是在这里写while true看起来很难看,而且不是Rubish; true看起来更好。这是一个两难的选择。

我的猜测是,因为loop的使用没有占用块并返回枚举器。但对我来说,它看起来很容易在现场创建无条件循环,并且创建loop的这样一个实例并在以后使用它时没有意义。我想不出用例。

  1. 我对我的奇迹的猜测是否正确?如果没有,为什么Enumerator是方法而不是关键字?
  2. loop创建的没有阻止的枚举数的用例是什么?

1 个答案:

答案 0 :(得分:1)

只有Ruby的开发人员可以回答您的第一个问题,但您的猜测似乎是合理的。至于你的第二个问题,确定有用例。 Enumerables的重点在于你可以传递它们,正如你所知,你可以使用whilefor结构。

作为一个简单的例子,这里是一个以Enumerable为参数的Fibonacci序列方法:

def fib(enum)
  a, b = nil, nil

  enum.each do
    a, b = b || 0, a ? a + b : 1
    puts a
  end
  puts "DONE"
end

现在假设您要打印出前七个斐波那契数字。你可以使用任何产生七次的Enumerable,比如7.times返回的那个:

fib 7.times
# => 0
#    1
#    1
#    2
#    3
#    5
#    8
#    DONE

但是如果你想永远打印出斐波那契数字怎么办?好吧,只需将loop返回的Enumerable传递给它:

fib loop
# => 0
#    1
#    ...
#    (Never stops)

就像我说的,这是一个愚蠢的例子,显然是生成斐波那契数字的一种可怕的方式,但希望它能帮助你理解有时候 - 尽管可能很少 - 当有一个可用的数字时它很有用永远不会结束,为什么loop对这些案件来说是一个很好的方便。