“nil无法强制进入Fixnum”意外错误

时间:2013-10-02 16:19:33

标签: ruby

我正在编写一个小型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 :(得分: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>'