Рубиновый тест на ноль выдает ошибку - PullRequest
2 голосов
/ 26 февраля 2011
  1. x - массив.
  2. Обратите внимание на два сравнения ниже . Первый должен выдавать «истину», как и ожидалось. Второй выдает ошибку. Что здесь происходит?

Почему отрицательное сравнение для nil не выдает false во втором втором тесте ?

ruby-1.9.2-p136 :079 > x[2]['comments']['data'][0]['from']['name'] != nil
 => true 

x[2]['comments']['data'][1]['from']['name'] != nil
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]
    from (irb):78
    from /Users/justinz/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands/console.rb:44:in `start'
    from /Users/justinz/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands/console.rb:8:in `start'
    from /Users/justinz/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

Ответы [ 4 ]

2 голосов
/ 26 февраля 2011

Я думаю, это потому, что значение x[2]['comments']['data'][1] равно нулю.

Возможно, вы захотите использовать этот вспомогательный метод вместо:

def nullsafe_index(a, keys)
    keys.each{|key|
        return nil if a.nil?
        a = a[key]
    }
    return a
end

Используйте вот так:

nullsafe_index(x, [2, 'comments', 'data', 0, 'from', 'name']).nil?
1 голос
/ 26 февраля 2011

x [2] ['comments'] ['data'] [1] - пустой хеш, поэтому, когда вы вызываете ['from'] для него, результат равен nil, что означает вызов ['name'] на этот результат ноль, выдает ошибку. Вот как вы можете воспроизвести это:

x = {}
x['from'] #=> nil
x['from']['name'] #=> NoMethodError

Вы можете рассматривать свой запрос как набор вызовов функций:

x[2]['comments']['data'][1]['from']['name']
# is equivalent to:
x.[](2).[]('comments').[]('data').[](1).[]('from').[]('name')

Если какой-либо из этих вызовов функции возвращает nil, вы не можете сделать еще один вызов функции [] без ошибки.

0 голосов
/ 26 февраля 2011

x[2]['comments']['data'][1] == nil?

Попробуйте оценить каждый фрагмент вашего выражения:

x[2]
x[2]['comments']
x[2]['comments']['data']
x[2]['comments']['data'][1]
x[2]['comments']['data'][1]['from']
x[2]['comments']['data'][1]['from']['name']
0 голосов
/ 26 февраля 2011

Похоже, что x[2]['comments']['data'] не имеет второго элемента. Это эквивалентно вызову nil['from'], что также вызовет исключение.

...