Ruby Array find_first nesnesi?


135

Dizi belgelerinde bir şey mi eksik? Belirli bir kriteri tatmin eden bir nesneye kadar içeren bir dizi var. Bu nesneyi verimli bir şekilde bulmak istiyorum. Dokümanlardan aldığım en iyi fikir şudur:

candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?

Ama iki nedenden dolayı memnun değilim:

  1. Bu select, ilk vuruştan sonra kefaletle olsa bile, tüm diziyi geçmemi sağladı.
  2. Adayları düzleştirmek için bir kod satırı (şartlı) gerekiyordu.

Her iki işlem de 0 veya 1 tatmin edici nesne olduğunu önceden bilerek israf ediyor.

Ne istiyorum gibi bir şey:

array.find_first(block)

bu da nil veya bloğun true olarak değerlendirildiği ilk nesneyi döndürerek o nesnede geçişi sonlandırır.

Bunu kendim mi yazmalıyım? Array'daki diğer tüm harika yöntemler bana orada olduğunu düşündürüyor ve görmüyorum.

Yanıtlar:


201

Sorunu anlamıyorum ya da Enumerable # find aradığınız şey.


32
Sorun değil, aynı zamanda yakut belgelerin miras alınan veya dahil edilen sınıfların ve modüllerin yöntemlerini listelemediğini sıkıcı buluyorum.
Mladen Jablanović

4
daha fazla bilgi: [1,2,3,5,2].find { |n| puts n; n == 2 } yinelendiği ilk öğeyi bulduğunda yineleme durur.
rajuGT

97

detectbloğun true döndürdüğü ilk değeri döndürmek istiyorsanız dizi yöntemini kullanın

[1,2,3,11,34].detect(&:even?) #=> 2

OR

[1,2,3,11,34].detect{|i| i.even?} #=> 2

Bloğun true olduğu tüm değerleri döndürmek istiyorsanız şunu kullanın: select

[1,2,3,11,34].select(&:even?)  #=> [2, 34]

5
.detecttam da ihtiyacım olan şey. Peki .findo zaman farkı nedir?
Augustin Riedinger

13
@AugustinRiedinger fark yok, ikisi de aynı. ruby-doc.org/core-2.1.2/Enumerable.html#method-i-finddetect için bir takma find addır
Sandip

bazı tutarlılık için bulmayı tercih Ruby Stil Kılavuzu , takip etmek istiyorum
Paul van Leeuwen

20

Sanırım dokümanlarda bulma yöntemini kaçırdınız:

my_array.find {|e| e.satisfies_condition? }

8
Veya kod golfünü seviyorsanız,my_array.find(&:satisfies_condition?)
Andrew Grimm

14

Nesneyi kendisi ihtiyaç ya da sadece orada olmadığını bilmek gerekir mı olduğunu tatmin olduğunu bir nesne. Eğer eskisi evet ise: find:

found_object = my_array.find { |e| e.satisfies_condition? }

aksi takdirde kullanabilirsiniz any?

found_it = my_array.any?  { |e| e.satisfies_condition? }

İkincisi, koşulu karşılayan birini bulduğunda "true" ile kefalet eder. Birincisi aynısını yapacak, ama nesneyi geri getirecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.