2013-10-02 3 views
0

Я пишу небольшой алгоритм Ruby, который выдает указанную выше ошибку только для значений, заканчивающихся «1», например «21», «31», «41».«nil не может быть принудительно в Fixnum» непредвиденная ошибка

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 

Но нет ... Я в замешательстве.

+0

Почему вы используете 'memo + = ...' вместо 'memo + ...'? –

+0

Из-за незнания :). Спасибо, я всегда делал + =, * = и т. Д. – rfish26535

ответ

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>' 
+0

ninja'd снова .. –

+0

Спасибо за ваш ответ. Я полностью забыл об этом. – rfish26535

Смежные вопросы