我正在编写一个小的Ruby算法,该算法仅在以"1"结尾的值上抛出上述错误,例如"21","31","41"。
success = []
(1..9_999_999).each do |num|
num_s = num.to_s.split("")
if num_s.inject(0){ |memo, val| memo += (1..val.to_i).inject(&:*) } == num
success << []
end
end
奇怪的是,主代码行本身没有错误:
["2", "1"].inject(0){ |memo, val| memo += (1..val.to_i).inject(&:*) } #-> 3
根据错误,我认为这样做可能存在问题:
(1.."1".to_i).inject(&:*) #-> 1
但是没有...我很困惑。
>> ["1", "0"].inject(0){ |memo, val| memo += (1..val.to_i).inject(&:*) } #-> 3
TypeError: nil can't be coerced into Fixnum
from (irb):2:in `+'
from (irb):2:in `block in irb_binding'
from (irb):2:in `each'
from (irb):2:in `inject'
from (irb):2
from C:/Ruby200-x64/bin/irb:12:in `<main>'
发生上述错误是因为:(1..0).inject(&:*)
返回nil
。
>> (1..0).inject(&:*)
=> nil
>> 0 * (1..0).inject(&:*)
TypeError: nil can't be coerced into Fixnum
from (irb):4:in `*'
from (irb):4
from C:/Ruby200-x64/bin/irb:12:in `<main>'