2016-03-22 15 views
0

İlgili anahtarların belirli bir koşulla eşleştiği bir hash değerini yazdırmaya çalışıyorum (eğer tek ise).Her ikisi için & her ilmekler ruby ​​içinde bir karma boyunca yineleme yaparken durduktan sonra

benim döngü

Aşağıdaki kodu yalnızca ilk eşleşen değeri döndürür sonra durmasına neden olan bir sorun yaşıyorum.

if mycondition 
for key,value in myhash do 
    if key.odd? 
    return "#{value}" 
    end 
end 
end 

diğer bazı soruları okuduktan sonra return sorunum olduğunu düşünmüş, ama bunu dışarı alırken, kod yerine sadece bir eşleme değerinin tamamını karma döndürür.

Neyin olabileceğini bilen var mı?

cevap

1

Bu bunu yapmanın çok daha Yakut yoludur: Burada

myhash.select do |key, value| 
    key.odd? 
end.values 

tüm garip anahtarları bulur ve ilişkili değerleri döndürür.

return ile ilgili sorun, tüm yöntemlerin oradan ve oradan çıkmak için zorlanmasıdır. Biraz kafa karıştırıcı olabilecek JavaScript'e alışkınsanız, sadece do bloğundan çıkmıyorsunuz.

Not olarak, for yapısı Ruby'de neredeyse hiç kullanılmamaktadır. Orijinal kod ifade etmenin bir daha geleneksel yoludur: Yalnızca bir anahtarı almak yüzden bu yüzden

myhash.each do |key, value| 
    # ... 
end 
+0

Teşekkürler! Bu çalıştı! :) – mbake

1

size return sonra, fonksiyon, bitti.

return hiçbir şey yapmazsanız, işlev son ifadesini döndürür, bu durumda for döngüdür. for döngüler, (myhash) üzerinde döngü yaptığınız şeyleri değerlendirir, bu yüzden return'un kaldırılması size her şeyi verir. ,

if mycondition 
    ret = [] 
    for key, value in myhash do 
    if key.odd? 
     ret << [key, value] 
    end 
    end 
    return Hash[ret] 
end 

Ama Yakut karmasının bir alt kümesini çekmek için çok daha güzel yollar vardır: Senin durumunda

Eğer dönmek istiyorum şeylerin listesini oluşturmak gerekiyor ve o tüm listeyi iade örneğin:

Hash[myhash.select{|k,v| k.odd?}] 
+1

Son örneğinizden bile daha iyi: ['Hash # ret '] (http://docs.ruby-lang.org/en/2.3.0/Hash.html#method-i-reject) – tadman

+0

Haklısınız ! :-) –

İlgili konular