Проблема с кодом объясняется Ed S.
В противном случае, вы можете сделать
products.reject! { |s| s.nil? || s.strip.empty? }
Почему вы должны проверить nil?
первый? Давайте проверим несколько строк.
nil.strip
# NoMethodError: undefined method `strip' for nil:NilClass
" ".strip
# => ""
Теперь, с другим порядком, что делает код, если объект является строкой, а затем, если он равен нулю.
" ".strip || " ".nil?
# => ""
nil.strip || nil.nil?
# NoMethodError: undefined method `strip' for nil:NilClass
# Oh you don't want that to happen, do you?
Это означает, что вы не хотите, чтобы позвонить strip.empty?
, когда ваш объект nil
.
И как вы знаете, если у вас есть a || b
, если a является правдивым (то есть не nil
, ни false
), b
никогда не будет называться.
Сначала вы тестируете, если строка nil
; если это так, вам не нужно проверять правильную часть (чтобы вы не получили неопределенную ошибку метода), и объект будет удален из вашего списка продуктов.
'products.reject! {| s | s.strip.empty? || s.nil? } ' – oldergod
Вы хотите изменить это на' products.reject! {| продукт | product.nil? || product.strip.empty? } 'в противном случае вы попробуете' strip' 'nil' – Momer
@Momer вы так правы, спасибо! – oldergod