Ruby:NoMethodError:未定义的方法`[]&#39; for#<enumerator:0x007f8683922870>

时间:2017-07-19 04:19:59

标签: ruby recursion nomethoderror

编辑两个

我注意到在运行程序时,它还返回nil作为数组中的最后一项。为了解决这个问题,我改变了我的状况。

if array_list.empty? ----> if array_list.length == 1

这将返回没有nil

的数组

修改 感谢@mudasobwa的帮助。

他指出我的程序出了几个问题:一个是我用array编写array.index而不是required()

还了解到我不应该在方法名称及其参数之间放置空格。

此处更新了代码,查看原始内容以了解其更改方式。

list_one = ["apple", "anna", "banana", "peach", "cherry", "kiwi", "pineapple"]

def sort_array(array_list, sorted_array=[])

  sorted_array.push(array_list.min)
  if array_list.empty? || array_list.nil?
    return sorted_array
  else
    array_list.delete_at(array_list.index(array_list.min))
  return sort_array(array_list, sorted_array)
end

end

sort_array(list_one)

如果有人有其他改进或建议,请告诉我。实际上,这个递归函数似乎完美无缺,尽管我还有很多东西可以学习如何在将来实现递归函数。我的大脑很难缠绕它。

结束编辑,原版以下

我正在阅读Chris Pine的书“学习编程”,其中一个练习是制作一个递归排序方法来对项目列表进行排序。

这是我的代码:

list_one = ["apple", "anna", "banana", "peach", "cherry", "kiwi", "pineapple"]

def sort_array (array_list, sorted_array=[])
  sorted_array = sorted_array
  sorted_array.push(array_list.index[array_list.min])
  if array_list.empty?
    return sorted_array
  else
    array_list.delete_at(array_list.index[array_list.min])
    return sort_array(array_list, sorted_array)
end

end

sort_array (list_one)

现在,克里斯的书要求使用我尝试合并的包装函数,但在这种情况下它并没有任何区别。刚刚提出这个问题有点令人难以置信,我需要阅读更多关于递归函数的信息来达到这一点。

运行时,我收到标题中列出的错误。我还没有运气再搞清楚这一点,所以我希望这里的某个人可以解释一下我可能做错了什么。

如果我加入Chris的包装函数:

def sortme (some_array)
  sort_array(some_array, [])
end

错误保持不变,考虑到包装函数只是调用sort_array函数,这是有道理的。在这种情况下,我真的不需要它。

有什么想法?为什么我收到此错误?

1 个答案:

答案 0 :(得分:1)

问题在于:

sorted_array.push(array_list.index[array_list.min])

使用Array#indexArray#[]

sorted_array.push(array_list.index(array_list.min))
# or sorted_array.push(array_list[array_list.min])

此代码有两个(或更多)故障:

sorted_array = sorted_array

是一个noop。你想用它完成什么?

并且,通常,永远不会在方法名称和开始括号之间放置一个空格,从而启动它的参数列表。在某些情况下,它可能无法正常工作。