2012-10-31 2 views
0
를 강요 할 수없는

나는 다음과 같은 기능을 가지고 : 무기 호는 Fixnum이라는

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

그리고 몇 가지 이유로 그럴 수 없어 오류가 왜 던져지고 있는지 파악하십시오. 왜 이런 일이 일어날 지 모릅니다.

답변

2

digits에 홀수 개의 요소가있는 경우 메서드가 실패합니다. 이 경우 마지막 반복에서 each_slice(2)을 호출하면 xdigits의 마지막 요소가되고 ynil이됩니다. 따라서 inject(:+) 단계에 도달하면 배열의 마지막 요소는 nil이고 해석기가 2 + nil과 같은 값을 치면 강제 오류가 발생합니다.

입력 한 자릿수에 초기 체크를 추가하지 않으시겠습니까? 다음과 같음 :

return false unless digits.length == 16 
+0

아! 어떻게 해결할 수 있을까요? – dennismonsewicz

+0

숫자가 16이 아닌 경우 false를 반환하는 문제는 모든 신용 카드가 Luhn 알고리즘을 통과하지 못한다는 것을 의미합니다 (위의 함수가 수행해야하는 것임) – dennismonsewicz

+0

https : // github.com/joeljunstrom/ruby_luhn – dennismonsewicz

관련 문제