Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby “loop”作为块参数传递给块的内容/原因_Ruby_Loops_Infinite Loop - Fatal编程技术网

Ruby “loop”作为块参数传递给块的内容/原因

Ruby “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]?不确定

创建一个无限循环,基本上创建一个迭代器,返回dummy
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)时间。