Apakah saya kehilangan sesuatu dalam dokumentasi Array? Saya memiliki array yang berisi hingga satu objek yang memenuhi kriteria tertentu. Saya ingin menemukan objek itu dengan efisien. Ide terbaik yang saya miliki dari dokumen adalah:
candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?
Tetapi saya tidak puas karena dua alasan:
- Itu
select
membuat saya melintasi seluruh jajaran, meskipun kami bisa menyelamatkan setelah hit pertama. - Saya membutuhkan sebaris kode (dengan syarat) untuk meratakan kandidat.
Kedua operasi tersebut boros dengan pengetahuan sebelumnya bahwa ada 0 atau 1 objek yang memuaskan.
Yang saya sukai adalah sesuatu seperti:
array.find_first(block)
yang mengembalikan nil atau objek pertama yang bloknya bernilai true, mengakhiri traversal pada objek itu.
Haruskah saya menulis ini sendiri? Semua metode hebat lainnya di Array membuat saya berpikir ada di sana dan saya tidak melihatnya.
ruby
arrays
performance
find
Manusia Timah
sumber
sumber
[1,2,3,5,2].find { |n| puts n; n == 2 }
iterasi berhenti setelah menemukan elemen pertama yang cocok.gunakan
detect
metode array jika Anda ingin mengembalikan nilai pertama di mana blok mengembalikan trueJika Anda ingin mengembalikan semua nilai di mana blok mengembalikan true lalu gunakan
select
sumber
.detect
persis apa yang saya butuhkan. Tapi apa bedanya dengan.find
itu?detect
hanyalah alias untukfind
ruby-doc.org/core-2.1.2/Enumerable.html#method-i-findKira Anda baru saja melewatkan metode pencarian di dokumen:
sumber
my_array.find(&:satisfies_condition?)
Apakah Anda memerlukan objek itu sendiri atau apakah Anda hanya perlu tahu apakah ada adalah sebuah objek yang memenuhi. Jika yang pertama maka ya: gunakan temukan:
jika tidak, Anda dapat menggunakan
any?
Yang terakhir akan menjamin dengan "benar" ketika menemukan yang memenuhi syarat. Yang pertama akan melakukan hal yang sama, tetapi mengembalikan objek.
sumber