#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