2013-12-13 4 views
-1

Я пытаюсь запустить .each на хэш. Однако иногда это ноль. Когда я проверю, что это ноль ... он говорит, что это не так. Затем я получаю следующее исключение:Хеш не поймает, если он равен нулю

undefined method `[]' for nil:NilClass 

Вот мой код. Любая идея, почему она не работает?

if @abc[:def] != nil 
    @abc[:def].each do |ghi|  <---- Fails Here 
    . 
    . 
    . 
    end 
end 

Любые идеи/предложения были бы замечательными.

Update:

@abc не равна нулю. Если я делаю Кладу из аЬса я получаю следующее:

puts "abc: #{@abc}" 
abc: {:val1=>"123", :val2=>"234"} 
puts "abc[:def]: #{@abc[:def]}" 
abc[:def]: [] 

@abc создается с помощью YAML. Вот как он создается.

@abc = YAML.load(File.open(pathToYamlFile/yamlFile.yml)) 
+2

'abc' не является массивом, это хэш. Есть большая разница в том, как к элементам обращаются, а методы не всегда ведут себя одинаково. Пожалуйста, покажите точный пример того, как определяется 'abc'. «Вопросы, связанные с проблемами с написанным кодом, должны описывать конкретную проблему и включать действительный код для ее воспроизведения - в самом вопросе. См. Http://SSCCE.org для руководства». –

+0

'@abc [: def] is nil' будет напечатан, когда вы запустите это:' @abc = {: val1 => "123",: val2 => "234"}; если @abc [: def]! = nil; @abc [: def] .each do | ghi |; ставит ghi; конец; еще; puts "@abc [: def] is nil"; end'? (Вы можете, конечно, заменить каждый из моих полуколоний на новую строку.) Пожалуйста, покажите, как этот код изменен, чтобы дать ваш результат. Кстати, я предлагаю вам написать 'puts '@abc: # {@ abc}" # => abc: {: val1 => "123",: val2 => "234"} ', чтобы вы не отображали смешанные строки кода и выход. –

+0

@theTinMan Это должно быть исправление. Извините за путаницу. –

ответ

2

Попробуйте

if @abc && @abc[:def] 
    @abc[:def].each do |ghi| 
    . 
    . 
    . 
    end 
end 

Если вы все еще получаете ошибку, то это, вероятно, происходит в блоке, и сообщение об ошибке просто находит линии, где блок начинается.

+0

@abc не ноль. Я обновил свой оригинальный пост, чтобы показать, что это такое. –

+0

@CameronJones Вероятно, это ошибка * внутри * блока 'each', где вы пытаетесь получить доступ к' nil [] ', и сообщение об ошибке просто находит строку, где начинается блок. Попытайтесь найти ошибку в блоке или разместите блок, если хотите больше взглянуть на него. – Matt

+0

@abc не ноль. Я показал, что он отображает в моем оригинальном посте. Тем не менее, @abc [: def] - это массив ... вот почему я делаю .each на нем. Это значение, которое равно нулю. Однако, когда я делаю чек, он не поймает его. Это то, что я считаю странным. –

0
if @abc.nil? && @abc[:def].nil? 
    # do the other stuffs 
end 
+0

@abc не ноль. Я обновил свой оригинальный пост, чтобы показать, что это такое. –

+0

попробуйте, , если @abc [: def] .nil? # do end – Emu

+0

Если я это сделаю, тогда он выдает ошибку на этой строке. –

0

вместо if @abc[:def] != nil

использования

if @abc.key?(:def) && [email protected][:def].nil?

+0

Это может быть хороший совет в целом, но я не вижу, как он отвечает на вопрос. –

+0

@ cary-swoveland спасибо, я обновил свой ответ – prashanth

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