¿Me falta algo en la documentación de la matriz? Tengo una matriz que contiene hasta un objeto que cumple un cierto criterio. Me gustaría encontrar eficientemente ese objeto. La mejor idea que tengo de los documentos es esta:
candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?
Pero no estoy satisfecho por dos razones:
- Eso
select
me hizo atravesar todo el conjunto, a pesar de que podríamos habernos rescatado después del primer golpe. - Necesitaba una línea de código (con una condición) para aplanar a los candidatos.
Ambas operaciones son un desperdicio con el conocimiento previo de que hay 0 o 1 objetos satisfactorios.
Lo que me gustaría es algo como:
array.find_first(block)
que devuelve nil o el primer objeto para el cual el bloque se evalúa como verdadero, finalizando el recorrido en ese objeto.
¿Debo escribir esto yo mismo? Todos esos otros excelentes métodos en Array me hacen pensar que está allí y simplemente no lo veo.
ruby
arrays
performance
find
el hombre de hojalata
fuente
fuente
[1,2,3,5,2].find { |n| puts n; n == 2 }
iteración se detiene una vez que encuentra el primer elemento que coincide.use el
detect
método de matriz si desea devolver el primer valor donde el bloque devuelve verdaderoSi desea devolver todos los valores donde el bloque devuelve verdadero, use
select
fuente
.detect
es exactamente lo que necesito Pero, ¿cuál es la diferencia con.find
entonces?detect
es solo un alias parafind
ruby-doc.org/core-2.1.2/Enumerable.html#method-i-findSupongo que te perdiste el método de búsqueda en los documentos:
fuente
my_array.find(&:satisfies_condition?)
¿Necesita el objeto mismo o sólo necesita saber si hay es un objeto que satisface. Si es lo primero, entonces sí: use find:
de lo contrario puedes usar
any?
Este último saldrá con "verdadero" cuando encuentre uno que satisfaga la condición. El primero hará lo mismo, pero devolverá el objeto.
fuente