2012-09-30 21 views
5

Enumerable#each ve Enumerable#map arasındaki fark, alıcının veya eşlenen sonucun geri dönüp dönmediğidir. Alıcıya geri dönmek önemsizdir ve genellikle each{...}.another_method gibi each'dan sonra bir yöntem zincirine devam etmeniz gerekmez (muhtemelen böyle bir durumla karşılaşmadım. Alıcıya geri dönmek isteseniz bile bunu tap ile yapabilirsiniz). Bu yüzden, Enumerable#each'un kullanıldığı tüm veya çoğu durumda, Enumerable#map ile değiştirilebilir. Yanlış mıyım? Eğer haklıysam, each'un amacı nedir? map, each'dan daha yavaş mı?Tüm "her" ifadesi "map" ile değiştirilemez mi?

Düzenleme: Sana dönüş değeri ile ilgilenen olmadığında each kullanmak yaygın bir uygulama olduğunu biliyoruz. Bu tür bir uygulamanın var olup olmadığıyla ilgilenmiyorum, ancak bu tür uygulamanın sözleşmenin bakış açısından başka bir anlam kazanıp yaratmadığıyla ilgileniyorum.

+1

Anlamalısınız ki 'her', 'haritanın' değil, 'Her' 'Enumerable'ın temel bir parçasıdır. ["Sınıf, her biri ',' koleksiyonunun ardışık üyelerini veren bir yöntem sağlamalıdır."] (Http://ruby-doc.org/core-1.9.3/Enumerable.html). –

+0

@muistooshort Bunun farkında değildim. Bunu düşüneceğim. Teşekkürler. – sawa

+2

"map" i "her" ve sonra "her" açısından "map" olarak uygulamayı deneyin, bu size biraz bilgi verebilir. –

cevap

5

map veya each arasındaki seçim sonuçlarına göre son noktaya karar verilmelidir: yeni dizi veya yeni dizi. map sonucu büyük ve/veya saçma olabilir: bir Yeni bir dizi döner ve diğer değildir olup daha önemlidir

p ("aaaa".."zzzz").map{|word| puts word} #huge and useless array of nil's 
+0

Yavaşsa, bunu kullanmamam gerektiğini anlıyorum, ama neden aptalca? Bunu hiç anlamıyorum. Ruby, her değerlendirmenin bir değer döndürdüğü fikri Lisp'ten miras almıştır. – sawa

+3

Bu "haritanın" sonucu, 456976 nil ile bir dizidir ('puts' bir nil döndürür). Oluşturulduktan sonra atılır. '' '' Öğesini kullanmak onu hiç oluşturmazdı, hafızayı kurtarırdı. (Kod biraz ayarlanmış) – steenslag

+0

İstediğim buydu. Performans açısından fark yaratıyor olsun. – sawa

2

Söylediklerinize katılıyorum. Enumerable#each, yalnızca çağrılan özgün nesneyi döndürürken, Enumerable#map, geçerli öğenin, bloğun dönüş değeri üzerine yinelenmesini ayarlar ve ardından bu değişikliklerle yeni bir nesne döndürür.

Enumerable#each yalnızca orijinal nesneyi döndürdüğü için, yalnızca öğe üzerinde yineleme veya geçiş yapmanız gereken durumlarda, map üzerinden çok iyi tercih edilebilir. Aslında, Enumerable#eachEnumerable#each, döngü için geleneksel yineleme yapmak için basit ve evrensel bir yoldur ve Ruby'deki döngüler için her biri çok tercih edilir.

+0

Dürüst olmak gerekirse, diğer insanların diğerlerinden nasıl bir yöntemi tercih ettikleri ile ilgilenmiyorum. 'Her' nin ayırt edici bir kullanımının mantıklı olup olmadığını merak ediyorum. – sawa

6

fark map ile each. Önemli fark, niyetinizi nasıl ilettikleridir.

each'u kullandığınızda, kodunuzda "Her öğe için bir şeyler yapıyorum" yazıyor. map'u kullandığınızda, kodunuz "her bir öğeyi dönüştürerek yeni bir dizi oluşturuyorum" diyor.

each yerine map'u kullanabildiğiniz halde, performans buna rağmen, kod şimdi okuyan herkesin niyetiyle ilgili olarak yalan söylüyor olabilir.

0

Bu enumaratiorları oluştururken map ve each arasındaki önemli farkı görebilirsiniz.

Örneğin Eğer içinde indixes ile yeni bir dizi almak gerekir:

array.each.with_index.map { |index, element| [index, element] } 

Veya örneğin sadece orijinal diziyi değiştirmeden dizi ve baskı sonucu tüm öğelerinin bazı yöntem uygulamak gerekir:

m = 2.method(:+) 

[1,2,3].each { |a| puts m.call(a) } #=> prints 3, 4, 5 

Ayrıca, each ve map arasındaki farkın, yazı biçiminde işlevsel stilde önemli bir anahtar olduğu birçok başka örnek var.

İlgili konular