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

実際には、一度に、それは空の文字列に減少し、次にnilに減少します。そして、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 に答える