2014-12-11 7 views
-2
a = [3, 2, 7] 
a[1] + a[2] # Result : 9 
a[1] + a[7] 
TypeError: nil can't be coerced into Fixnum 
    from (irb):18:in `+' 
    from (irb):18 
    from C:/RailsInstaller/Ruby1.9.3/bin/irb:12:in `<main>' 

Как вернуть значение [1], если [7] nil?Как вернуть значение, если другое значение равно нулю

+2

Возможно, вы используете инструкцию 'if'? –

+0

@MarekLipka такой же результат. nil can not принудительно в Fixnum –

+0

Является ли 'a [1] + a [2]' фактической операцией, которую вы выполняете, или упрощенным примером? – Stefan

ответ

1

Вы можете использовать тот факт, что nil.to_i == 0:

a = [3, 2, 7] 

a[1].to_i + a[2].to_i 
#=> 5 

a[1].to_i + a[7].to_i 
#=> 2 

Конечно, это будет работать только для сложения/вычитания и других операций, где нейтральный элемент является 0. Для более общего решения, вы можете использовать ||, чтобы установить значение по умолчанию:

a = [3, 2, 7] 

(a[1] || 1) * (a[2] || 1) 
#=> 6 

(a[1] || 1) * (a[7] || 1) 
#=> 2 
2

Одним из способов может стать использование fetch со значением по умолчанию:

a = [3, 2, 7] 
a.fetch(1, 0) + a.fetch(2, 0) # => 9 
a.fetch(1, 0) + a.fetch(7, 0) # => 2 
+0

Это лучше, потому что, вообще говоря, он также будет обрабатывать случай, когда 'false' является допустимым значением в массиве,' || 'не делает. –

0

Кто-то должен отметить очевидное :

a[1] + (7 < a.size ? a[7] : 0) 

Обратите внимание, что если 7 < a.size и a[7] является nil, исключение будет поднят (хорошо!). В отличие от этого, если мы ошибочно приняли a[7], равный nil, чтобы это означало, что a.size <= 7, присутствие ошибочного nil не будет отправлено. Конечно, для nil s довольно редко появляется, где они не принадлежат. Правильно?

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