Как вернуть нулевой объект, если во время сравнения совпадений нет

#ruby

#ruby

Вопрос:

 foo = foos.select{|x|x.name == xval}.first.value
  

Если совпадения для xval нет, то он вычисляется с помощью неопределенного метода на nil:NilClass . Как мне избежать этого и вместо этого вернуть nil объект?

Ответ №1:

Проверьте возвращаемый результат first метода:

 foo = foos.select {|x| x.name == xval }.first
foo.nil? ? nil : foo.value
  

ДОБАВЛЕНО: Или использовать Enumerable#find :

 foo = foos.find {|x| x.name == xval }
  

Комментарии:

1. если это будет выбранный ответ, вам следует проверить @mu answer и сначала изменить select на detect / найти. Ссылка на Rails ‘try или Ick’, возможно, также была бы хороша.

Ответ №2:

Вы можете немного его почистить, пропустив select / first в пользу find :

 one = foos.find { |x| x.name == xval }
foo = one ? one : nil
  

И если бы вы были в Rails, вы могли бы использовать try :

 foo = foos.find { |x| x.name == xval }.try(:value)
  

Ответ №3:

чтобы избежать [].first возврата nil, кажется странным.

вы можете проверить, действительно ли первый объект respond_to? является методом с именем value , перед вызовом метода.

скажем, foo_candidate.respond_to? :value возвращает true, если существует такой метод.

Ответ №4:

 require 'ick'
foo_value = foos.detect { |foo| foo.name == xval }.maybe.value