Ben Array
-> |value,index|
ve Hash
-> |key,value|
deli değil demiyorum (Horace Loeb'in yorumuna bakın), ama bu düzenlemeyi beklemenin mantıklı bir yolu olduğunu söylüyorum.
Dizilerle uğraşırken dizideki öğelere odaklanıyorum (dizin geçici olduğu için dizine değil). Yöntem her biri indeks, yani her bir + dizin veya | her, dizin | veya |value,index|
. Bu aynı zamanda dizin isteğe bağlı bir bağımsız değişken olarak görüntüleniyor, örn. | Value | | değer, index = nil | | değer, dizin | ile tutarlı olan.
Ben karmaları ile uğraşıyorum, ben çoğu zaman daha değerlerinden daha tuşların üzerinde duruldu ediyorum, ve ben genellikle anahtar ve bu sırayla değerlere ya uğraşıyorum key => value
ya hash[key] = value
.
Ördek yazmayı istiyorsanız, Brent Longborough'un gösterdiği gibi tanımlanmış bir yöntemi veya maxhawkins'in gösterdiği gibi örtük bir yöntemi kullanın.
Ruby, dili programcıya uyacak şekilde yerleştirmekle ilgilidir, dile uyacak programcı hakkında değildir. Bu yüzden bu kadar çok yol var. Bir şeyi düşünmenin pek çok yolu var. Ruby'de en yakını seçersiniz ve kodun geri kalanı genellikle son derece düzgün ve kısaca düşer.
Orijinal soruya gelince, "Ruby'de bir dizi üzerinden yinelemenin" doğru "yolu nedir?"
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
Ancak Ruby tamamen güçlü sözdizimsel şeker ve nesne yönelimli güçle ilgilidir, ancak burada yine de karmalar için eşdeğerdir ve anahtarlar sipariş edilebilir veya edilmeyebilir:
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
Yani, cevabım, "Ruby'deki bir dizi üzerinden tekrarlamanın" doğru "yolu size (yani programcıya veya programlama ekibine) ve projeye bağlıdır." Daha iyi Ruby programcısı daha iyi bir seçim yapar (hangisinin sözdizimsel gücü ve / veya hangi nesne yönelimli yaklaşım). Daha iyi Ruby programcısı daha fazla yol aramaya devam eder.
Şimdi başka bir soru daha sormak istiyorum: "Ruby'deki bir Range boyunca geriye doğru“ doğru ”yol nedir?”! (Bu soru bu sayfaya nasıl geldiğimdir.)
Bunu yapmak güzel (forvetler için):
(1..10).each{|i| puts "i=#{i}" }
ama (geriye doğru) yapmak istemiyorum:
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
Aslında bunu çok fazla yapmayı umursamıyorum, ancak geriye doğru gitmeyi öğrettiğimde, öğrencilerime hoş bir simetri göstermek istiyorum (yani minimum farkla, örneğin sadece bir ters veya adım -1 eklemek, ancak başka bir şeyi değiştirmek). Şunları yapabilirsiniz (simetri için):
(a=*1..10).each{|i| puts "i=#{i}" }
ve
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
ki çok sevmiyorum ama yapamazsın
(*1..10).each{|i| puts "i=#{i}" }
(*1..10).reverse.each{|i| puts "i=#{i}" }
#
(1..10).step(1){|i| puts "i=#{i}" }
(1..10).step(-1){|i| puts "i=#{i}" }
#
(1..10).each{|i| puts "i=#{i}" }
(10..1).each{|i| puts "i=#{i}" } # I don't want this though. It's dangerous
Sonuçta yapabilirsin
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
ama nesne yönelimli yaklaşımlardan ziyade saf Ruby öğretmek istiyorum (henüz). Geriye doğru tekrarlamak istiyorum:
- bir dizi oluşturmadan (0..1000000000'i düşünün)
- herhangi bir Aralık için çalışma (ör. yalnızca Tamsayılar değil, Dizeler)
- herhangi bir ekstra nesne yönelimli güç kullanmadan (yani sınıf değişikliği olmadan)
Bunun bir pred
yöntem tanımlanmadan imkansız olduğuna inanıyorum ; Bunu yapabilirseniz lütfen bana bildirin, aksi takdirde hayal kırıklığı yaratacağı halde imkansızlığın teyidi takdir edilecektir. Belki Ruby 1.9 buna hitap ediyor.
(Bunu okuduğunuz için teşekkür ederiz.)
array#each_with_index
kullanır sanırım ?|value, key|
hash#each
hash[key] = value