如果在比较期间没有匹配项,如何返回nil对象

时间:2011-11-10 05:47:12

标签: ruby

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

如果xval没有匹配,则它会在nil:NilClass上评估为未定义的方法。我应该如何避免这种情况并改为返回nil对象?

4 个答案:

答案 0 :(得分:3)

检查first方法的返回结果:

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

ADDED:或使用Enumerable#find

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

答案 1 :(得分: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)

答案 2 :(得分:0)

避免[].first返回nil似乎很奇怪。

在调用方法之前,您可以检查第一个对象是否真正respond_to?一个名为value的方法。

如果有这样的方法,foo_candidate.respond_to? :value会返回true。

答案 3 :(得分:0)

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