Ruby代码qn。 如何减少迭代

我是ruby的新手,我想知道为什么会出现这个错误。 (抱歉格式不正确)

错误:

rb37: in '%': nil can't be coerced into Fixnum (TypeError) 

而且我的问题也需要帮助。 我想要提出一种方法来运行一个包含100万个ID号的列表,以便以最有效的方式(在不到5分钟内)找到一个特定的ID。 我整个下午一直在这里:(

 def exist?(id) dump = [] employee_list = $employee_list.sort #employee_list is an array of 1 million lines of data, I have to look for a specific "id" while dump.length < id dump << employee_list.first if dump.last != id if id%dump.last != 0 && dump.last != 1 employee_list.delete_if { |n| n%dump.last == 0 } #what im doing here is to delete ID from employee_list that are multiples of n elsif id%dump.last == 0 employee_list.delete_if { |m| m%dump.last == 0 && m!=id } #deleting multiples of m (excluding id itself) end elsif dump.last == id return true end end return false end 

老实说,我完全不知道你的代码试图做什么,但问题是:你循环直到dump数组的长度大于你正在搜索的id 。 在循环中,将employee_list数组的第一个元素追加到dump的末尾。 您还可以从employee_list删除内容。

现在,根据id大小,你将经常循环。 例如,假设id1234567890 ,你将循环超过十亿次,并且你将超过十亿个元素附加到你的dump数组。 与此同时,您还会不断删除employee_list 。 很可能,在某个时间点, employee_list将变为空,这意味着employee_list.first将变为nil ,您将附加nil作为dump的最后一个元素,因此您将尝试获取id的模数和在第nil或13行中没有。

就像我说的,我实际上并不了解你在做什么,所以我不能告诉你如何解决这个问题。

这是我如何解决问题:

 def exist?(id) $employee_list.find(id) end