0

我不确定为什么这个递归方法会返回NoMethodError: undefined method '[]' for nil:NilClass

def test_method(a, b)
    (a[0] == b[0] ? 0 : 1) + test_method(a[1..-1], b[1..-1])
end

编辑:我正在发送字符串以供比较它们的参数。

4

3 回答 3

1

这是因为您没有检查 a 和 b 是否为空数组。一次将减少为空数组

在打电话之前你应该写

 if not (a.empty? or b.empty?)
  (a[0] == b[0] ? 0 : 1) + test_method(a[1..-1], b[1..-1])
 end
于 2012-09-11T19:20:53.097 回答
1

实际上,有一次,它会减少为空字符串,然后为零。然后导致 NoMethodError: undefined method '[]' for nil:NilClass。

正在发生这样的事情:

'ss'[1..-1] => 's'
'ss'[1..-1][1..-1] => ""
'ss'[1..-1][1..-1][1..-1] => nil
于 2012-09-11T19:24:06.327 回答
1

由于您正在迭代一个更小的数组/字符串/任何内容,因此您必须考虑到达它的末尾。我不知道您要完成什么,但这至少可以阻止它爆炸:

def test_method(a, b)
  return 0 if a.nil? || b.nil?
  (a[0] == b[0] ? 0 : 1) + test_method(a[1..-1], b[1..-1])
end
于 2012-09-11T19:26:59.243 回答