0

私は次の機能を持っています:

def valid_credit_card?(number)
    digits = number.scan(/./).map(&:to_i)
    check = digits.pop

    sum = digits.reverse.each_slice(2).map do |x, y|
        [(x * 2).divmod(10), y]
    end.flatten.inject(:+)

    (10 - sum % 10) == check
end

しかし、何らかの理由で、次のエラーメッセージが表示され続けます。 nil can't be coerced into Fixnum

そして、何らかの理由で、エラーがスローされる理由を理解できません。なぜこれが起こっているのでしょうか?

4

1 に答える 1

2

digits要素の数が奇数の場合、メソッドは失敗します。その場合、each_slice(2)最後の反復で呼び出すxと、 の最後の要素にdigitsなり、yになりますnilinject(:+)したがって、フェーズに到達すると、配列の最後の要素はnilになり、インタープリターが のようなものにヒットすると、強制エラーが発生します2 + nil

入力桁数の初期チェックを追加してみませんか? 何かのようなもの:

return false unless digits.length == 16
于 2012-10-31T19:54:56.703 に答える