2012-09-11 56 views
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 

编辑:我在字符串发送的参数进行比较。

+1

你发送了什么参数到这个方法来获得这个异常? –

+0

我在发送字符串来比较它们。 – Fralcon

回答

1

事实上,在同一时间,它会降低空字符串,然后到零。然后导致NoMethodError:undefined方法'[]'为nil:NilClass。

像这样的事情正在发生:

'ss'[1..-1] => 's' 
'ss'[1..-1][1..-1] => "" 
'ss'[1..-1][1..-1][1..-1] => nil 
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 
+0

我计划在稍后添加空字符串检查。我需要检查它的权利吗?我一直在做的所有测试都使用长度超过5个字符的字符串,所以我认为这不会有问题。 – Fralcon

+0

,但有时候会像[6 ..- 6]一样回零。在控制台中检查这一点 –

+0

如果它是递归的,那么在某些时候你必须达到目的。 – Azolo

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