Ruby “loop”作为块参数传递给块的内容/原因
创建一个无限循环,基本上创建一个迭代器,返回dummyRuby “loop”作为块参数传递给块的内容/原因,ruby,loops,infinite-loop,Ruby,Loops,Infinite Loop,创建一个无限循环,基本上创建一个迭代器,返回dummyQnil值: loop.with_index do |what, index| puts [what, index].inspect # what == Qnil, returned from iterator break end #⇒ [nil, 0] 我们很可能不能有一个产生void的迭代器,这就是为什么。现在的问题是(感谢@Stefan明确的措辞):为什么循环。peek\u values返回一个空数组,而不是[nil]?不确定
Qnil
值:
loop.with_index do |what, index|
puts [what, index].inspect # what == Qnil, returned from iterator
break
end
#⇒ [nil, 0]
我们很可能不能有一个产生void的迭代器,这就是为什么。现在的问题是(感谢@Stefan明确的措辞):为什么
循环。peek\u values
返回一个空数组,而不是[nil]
?不确定我是否理解您的问题。为什么loop
应该产生一个索引?@Stefan因为它很方便,而且因为它不能产生任何东西,是什么让链式调用看起来很难看,因为它带有强制性但冗余的下划线。与_index
在这方面是不一致的(我认为是断开的)。当将与_index
一起使用时,您无法区分收益率
和收益率为零
或收益率:foo,:bar
和收益率[:foo,:bar]
之间的区别。@Stefan好的,看来我明白了。顺便说一句,每个带有\u对象的\u
的行为方式与带有\u索引的的行为方式相同。这些带有*
的在内部有一个严格的签名,没有飞溅的两个参数(第一个用于项目,第二个用于任何项目)。在块参数声明中,可以使用条内的括号对项目进行“多重赋值”。但由于存在两个强制性参数,因此此nil
是不可避免的。谢谢循环
不产生
索引的原因很简单,Ruby Issue Tracker(建议添加索引的地方)也讨论过:它用于无限循环,在这种情况下,索引(甚至没有使用99%的时间)需要无限长的时间增量和无限的内存存储。现在,我不知道你的情况,但我的电脑没有无限内存。即使不用于无限循环,也意味着存储索引需要O(n)空间。由于Integer
s是不可变的,增加索引需要复制索引,这需要O(logn)时间。