foo = foos.select{|x|x.name == xval}.first.value
如果xval
没有匹配,则它会在nil:NilClass
上评估为未定义的方法。我应该如何避免这种情况并改为返回nil
对象?
答案 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