我花了很长时间调试我的代码,以查找为什么我的简单脚本挂起而没有错误消息/警告的原因。
我正在循环遍历枚举器,并根据该循环中的值执行某些任务。
marketplaces = ["ebay","amazon","shopify"].cycle.each
complete = false
while(!complete)
marketplace = marketplaces.next
if marketplace == "ebay"
// do abc
completed = 1
elsif marketplace == "amazon"
// do def
completed += 1
elsif marketplace == "shopify"
// do xyz
completed += 1
end
// indefinetely hangs here
if marketplaces.count == completed
complete = true
end
end
我知道现在您不能.count
在Ruby中调用Enumerator类型,但是为什么它只是挂起,幕后发生了什么?
要重现,只需创建任何数组并将其变成枚举数,然后对该对象调用计数:
谢谢
Array#cycle根据文档:
为每个元素调用给定的块n次;如果给定nil,则永远调用它。
由于未提供参数,因此它将无限期地调用该块,并遍历数组中的所有值,然后再次从第一个值开始。
您可以通过执行以下操作查看此信息:
[1,2].cycle { |i| p i }
为什么它挂了
count调用不会挂起,它会为每个产生的值递增计数器。由于Ruby中的整数可以任意大,最终count调用将耗尽内存并失败,但是这将花费非常非常长的时间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句