Czy brakuje mi czegoś w dokumentacji tablicy? Mam tablicę, która zawiera maksymalnie jeden obiekt spełniający określone kryterium. Chciałbym sprawnie znaleźć ten obiekt. Najlepszy pomysł, jaki mam z dokumentów, jest następujący:
candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?
Ale jestem niezadowolony z dwóch powodów:
- To
select
sprawiło, że przeszedłem przez całą tablicę, mimo że mogliśmy się wycofać po pierwszym trafieniu. - Potrzebowałem linii kodu (z warunkiem), aby spłaszczyć kandydatów.
Obie operacje są marnotrawstwem, ponieważ wiadomo, że istnieje 0 lub 1 zadowalających obiektów.
Chciałbym coś takiego:
array.find_first(block)
co zwraca nil lub pierwszy obiekt, dla którego blok zwraca wartość true, kończąc przemierzanie w tym obiekcie.
Czy muszę sam to napisać? Wszystkie te inne świetne metody w Array sprawiają, że myślę, że tam jest i po prostu tego nie widzę.
ruby
arrays
performance
find
Blaszany Człowiek
źródło
źródło
[1,2,3,5,2].find { |n| puts n; n == 2 }
iteracja zatrzymuje się, gdy znajdzie pierwszy pasujący element.użyj
detect
metody tablicowej , jeśli chcesz zwrócić pierwszą wartość, gdzie blok zwraca prawdęJeśli chcesz zwrócić wszystkie wartości, dla których blok zwraca prawdę, użyj
select
źródło
.detect
jest dokładnie tym, czego potrzebuję. Ale jaka jest w tym różnica.find
?detect
to tylko alias dofind
ruby-doc.org/core-2.1.2/Enumerable.html#method-i-findChyba właśnie przegapiłeś metodę find w dokumentach:
źródło
my_array.find(&:satisfies_condition?)
Czy trzeba samego obiektu czy po prostu trzeba wiedzieć, jeśli nie jest obiektem, który spełnia. Jeśli pierwszy, to tak: użyj find:
w przeciwnym razie możesz użyć
any?
Ten ostatni wyświetli „prawda”, gdy znajdzie taki, który spełnia warunek. Pierwsza zrobi to samo, ale zwróci obiekt.
źródło