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.