返回与相同函数分离的第一个truthy值

时间:2015-12-12 17:00:01

标签: ruby

我有以下代码:

def find_animal
  animal_type = AnimalKind.find_by(conditions) ||
                Animal.find_by(conditions) ||
                Breed.find_by(conditions)
end

我想将它重构为:

def find_animal
  animals = [AnimalKind, Animal, Breed]
  animal_type = animals.first_not_nil { |m| m.find_by(conditions) } 
end

有关如何实施first_not_nil方法的想法吗?

1 个答案:

答案 0 :(得分:7)

Enumerable#detect将短路并返回块返回truthy值的第一个对象。但它没有返回价值的结果(正如Oleskar Verhun所指出的那样)。因此,您可以将结果存储在循环外部的变量中,如下所示:

animal = nil
[AnimalKind, Animal, Breed].detect { |klass| 
  animal = klass.find_by(conditions) 
}

animal # will be nil or the first animal found by the supplied conditions