为什么调用依赖于枚举数会无限期挂起?

仇敌

我花了很长时间调试我的代码,以查找为什么我的简单脚本挂起而没有错误消息/警告的原因。

我正在循环遍历枚举器,并根据该循环中的值执行某些任务。

下面的示例只是为了演示如何产生此错误(我知道可以用更好的方式对此进行编码)

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类型,但是为什么它只是挂起,幕后发生了什么?


要重现,只需创建任何数组并将其变成枚举数,然后对该对象调用计数:

在此处输入图片说明

谢谢

D.SM

Array#cycle根据文档

为每个元素调用给定的块n次;如果给定nil,则永远调用它。

由于未提供参数,因此它将无限期地调用该块,并遍历数组中的所有值,然后再次从第一个值开始。

您可以通过执行以下操作查看此信息:

 [1,2].cycle { |i| p i }

为什么它挂了

count调用不会挂起,它会为每个产生的值递增计数器。由于Ruby中的整数可以任意大,最终count调用将耗尽内存并失败,但是这将花费非常非常长的时间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章