2012-06-11 30 views
5

Sayısız nesneyi enum aldığımı varsayalım ve şimdi üçüncü öğeyi almak istiyorum.Belirtilen dizine sahip bir sayım değerine bakın

ben bir diziye dönüştürmek genel yaklaşımın bir olduğunu ve daha sonra benzeri indeksi ile eriş:

enum.to_a[2] 

Ama bu şekilde geçici bir dizi yaratacak hem de verimsiz olabilir.

Şimdi kullanın:

enum.each_with_index {|v, i| break v if i == 2} 

Ama bu oldukça çirkin ve gereksiz olduğunu.

Bunu yapmanın en etkili yolu nedir?

cevap

5

Sen take size verdiği diziden üçüncü elemanı kapmak için daha sonra last ilk üç elemanı kalkmasına take kullanıp olabilir:

third = enum.take(3).last 

Tüm herhangi diziler oluşturmak istemiyorsanız o zaman belki:

Maalesef
# If enum isn't an Enumerator then 'enum = enum.to_enum' or 'enum = enum.each' 
# to make it one. 
(3 - 1).times { enum.next } 
third = enum.next 
+0

Ben endeksi olarak çok fazla sayıda isterseniz bu daha iyi görünüyor ama, yine de bunun için çok büyük bir geçici dizi üretecektir. –

+0

@ShouYa: Yorum yaparken başka bir dizi olmayan seçenek ekledim. Hala 'enum' tek tek işaretlemeniz gerekiyor ama bununla ilgili yapabileceğiniz hiçbir şey yok (genel olarak). –

+0

Bir sonraki kullanma akıllı bir öneridir. Bir koleksiyonun bir diziye dönüştürülmesinde performansın anlamlarının ne ile karşılaştırıldığını görmek merak ediyorum. –

1

, bir diziye dönüştürülmesi gerekir dizine göre bir üyeyi erişmek için (aksi takdirde ilk etapta bir dizin olmazdı), bu nedenle kod bana tamamen iyi görünüyor.

+0

Um, no. Eğer bir “Enumerator” ise '2' {e.next} 'işaretleyecektir ve ilk iki değeri atar ve üçüncü bir 'e.next' size herhangi bir dizi üretmeden üçüncü birisini verecektir. –

+0

@muistooshort yep, İpucunuza cevap verdim. Ve sen bu konuda haklısın. –

5

enumerable-lazy veya Ruby 2.1 kullanarak mu'nin alternatifi. next kullanma gibi tembel ama çok daha bildirim gibi:

enum.lazy.drop(2).first 
İlgili konular