Ruby'de yinelerken bir diziyi nasıl değiştiririm?


88

Ruby'yi öğreniyorum, eğer burası için fazla acemi ise özür dilerim, ama bunu kazma kitabından çıkaramıyorum (muhtemelen yeterince dikkatli okumuyorum). Neyse, böyle bir dizilim varsa:

arr = [1,2,3,4,5]

... ve diyelim ki dizideki her bir değeri 3 ile çarpmak istiyorum, şunu yaparak bunu çözdüm:

arr.each {|item| item *= 3}

... bana istediğimi vermeyecek (ve nedenini anlıyorum, dizinin kendisini değiştirmiyorum).

Anlayamadığım şey, orijinal diziyi yineleyiciden sonra kod bloğunun içinden nasıl değiştireceğim. Eminim bu çok kolaydır.

Yanıtlar:


140

Eskisinden mapyeni bir dizi oluşturmak için kullanın :

arr2 = arr.map {|item| item * 3}

map!Diziyi yerinde değiştirmek için kullanın :

arr.map! {|item| item * 3}

Çevrimiçi çalıştığını görün: ideone


2
Her bir öğeyi gerçekten değiştirmeniz gerekiyorsa, haritayı kullanmak kesinlikle daha zarif olacaktır, imho.
fresskoma

2
Ve dizinin kendisini değiştirmek istiyorsanız, haritayı kullanın! bunun yerine
Yoann Le Touche

18

Diziyi doğrudan değiştirmek için kullanın arr.map! {|item| item*3}. Orijinali temel alan yeni bir dizi oluşturmak için (ki bu genellikle tercih edilir), kullanın arr.map {|item| item*3}. Aslında, kullanmadan önce her zaman iki kez düşünüyorum each, çünkü genellikle daha yüksek dereceli bir işlev var map, selectya da injectistediğimi yapan bu.


Ya numaralandırma işlemi yapmak istemiyorsan? Ya arr.map!{ destructive_op}kalıcı olarak değiştirmek gibi bir şey yapmak istersen arr?
parlak yıldız

1
@TrevorAlexander: Ne demek istediğinden emin değilim. Ayrıntılar ve malzeme ile gerçek bir soru olarak sormaya değer olabilir.
Chuck

Bunun hakkında düşünmek zorunda kalacağım. Çok dar eleman modifikasyonu dışında, yapılar üzerindeki hangi yıkıcı işlemler sayılamaz?
parlak yıldız

@TrevorAlexander: Anlamakta hala zorlanıyorum. Bir yapının içeriğine bakamazsanız, içeriğini dönüştüremezsiniz. Kulağa bir yapıyı değiştirmekle ilgilenmiyorsunuz ve bunun yerine sadece bir değişken atamak istiyorsunuz - ama yanlış anlıyor olabilirim.
Chuck

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.