2012-10-31 46 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)時,x將是digits的最後一個元素,而y將是nil。所以當你進入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

相關問題