Estou faltando alguma coisa na documentação da matriz? Eu tenho uma matriz que contém até um objeto que satisfaz um determinado critério. Eu gostaria de encontrar com eficiência esse objeto. A melhor ideia que tenho dos documentos é a seguinte:
candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?
Mas estou insatisfeito por duas razões:
- Isso
select
me fez atravessar todo o conjunto, mesmo que pudéssemos ter escapado depois do primeiro golpe. - Eu precisava de uma linha de código (com uma condição) para achatar os candidatos.
Ambas as operações são um desperdício com o conhecimento prévio de que existem 0 ou 1 objetos satisfatórios.
O que eu gostaria é algo como:
array.find_first(block)
que retorna nulo ou o primeiro objeto para o qual o bloco é avaliado como verdadeiro, encerrando a travessia nesse objeto.
Devo escrever isso sozinho? Todos esses outros ótimos métodos em Array me fazem pensar que está lá e eu simplesmente não estou vendo.
fonte
[1,2,3,5,2].find { |n| puts n; n == 2 }
iteração para quando encontra o primeiro elemento correspondente.use o
detect
método array se você deseja retornar o primeiro valor em que block retorna trueSe você deseja retornar todos os valores em que block retorna true, use
select
fonte
.detect
é exatamente o que eu preciso. Mas qual é a diferença.find
então?detect
é apenas um alias parafind
ruby-doc.org/core-2.1.2/Enumerable.html#method-i-findAcho que você acabou de perder o método find nos documentos:
fonte
my_array.find(&:satisfies_condition?)
Você precisa do objeto em si ou você apenas precisa de saber se existe é um objeto que satisfaz. Se o primeiro for sim: use find:
caso contrário, você pode usar
any?
O último será liberado com "true" quando encontrar um que satisfaça a condição. O primeiro fará o mesmo, mas retornará o objeto.
fonte