Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用相同的函数在析取中返回第一个truthy值_Ruby - Fatal编程技术网

Ruby 使用相同的函数在析取中返回第一个truthy值

Ruby 使用相同的函数在析取中返回第一个truthy值,ruby,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

我有以下代码:

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\u not\nil
方法的任何想法?

将短路并返回块返回真实值的第一个对象。但它不会返回值的结果(正如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

这方面很难改进。我只建议做一个很小的风格改变,那就是使用
find
而不是
detect
,因为我认为
find\u by
读起来更好。这会找到类,但问题是要找到特定模型类的记录,所以这意味着您还需要添加
find\u by(条件)
最后,谢谢@OleksandrVerhun。修正了答案。如何在数组上生成单线函数?问题的
第一个\u或\u nil