2016-09-06 16 views
6

Harita işlevinde ne döneceğine karar vermek istediğim bir yöntem var. Bunun bir değişkenin atanmasıyla yapılabileceğinin farkındayım, ama böyle yapabildim;`Return` in Ruby Array # harita

def some_method(array) 
    array.map do |x| 
     if x > 10 
     return x+1 #or whatever 
     else 
     return x-1 
     end 
    end 
end 

İlk kez return isabet çünkü yönteminden döner değil, dönüş javascript haritasında işlevinde nasıl kullanıldığını benzer haritası işlevi, beklediğiniz gibi bu işe yaramaz.

İstenilen söz dizimi elde etmenin bir yolu var mı? Veya bunu bir değişkene atamam ve aşağıdaki gibi sonunda bırakmam gerekir:

def some_method(array) 
    array.map do |x| 
     returnme = x-1 
     if x > 10 
     returnme = x+1 #or whatever 
     end 
     returnme 
    end 
end 

cevap

12

Değişkene ihtiyacınız yok. Bloğun dönüş değeri, içinde değerlendirilen son ifadenin değeridir. Bu durumda, if.

def some_method(array) 
    array.map do |x| 
     if x > 10 
     x+1 
     else 
     x-1 
     end 
    end 
end 

Üçlü operatörün daha güzel görüneceğini düşünüyorum. Daha fazla ifade-ish.

def some_method(array) 
    array.map do |x| 
    (x > 10) ? x+1 : x-1 
    end 
end 

Eğer return kullanmakta ısrar ederse, o zaman lambdas kullanabilirsiniz. Lambdalarda, return, normal yöntemlerde olduğu gibi davranır. Yine de, bu form nadiren görülür. Kodunuz kısasa, kesinlikle ifadeler olarak yeniden yazılabilir. Eğer kodunuz çok sayıda çıkış noktası gerektirecek kadar uzun ve karmaşıksa, muhtemelen basitleştirmeyi denemelisiniz.

+0

Güzel! Kodumu biraz değiştirmem gerekti, ama bunun harika bir çözüm olduğuna inanıyorum! – Automatico

+1

@ Cort3z: güncellenmiş yanıtı kontrol et :) –

15

Sergio cevabı çok iyidir, ancak işe return istediği şekilde çalışır bir anahtar kelime olduğunu belirtmekte fayda var: next. Sergio belirttiği gibi, orada bir şey gerekmez, çünkü

array.map do |x| 
    if x > 10 
    next x + 1 
    else 
    next x - 1 
    end 
end 

Bu next çok iyi bir kullanım değildir. Ancak, next numarasını daha kısa sürede ifade etmek için kullanabilirsiniz:

array.map do |x| 
    next x + 1 if x > 10 
    x - 1 
end 
+1

Bu güzel! Benim asıl kodum yukarıdaki örneğimden biraz daha kıvrık, yani 'next' çok güzel bir çözüm olabilir. Şahsen ben ruby'nin tüm bu "sihir" davranışını beğenmedim. Neler olup bittiğini açıkça belirtmek güzel, bu yüzden bir sonraki kişinin onu alması daha kolay. – Automatico

+0

Çok daha iyi bir cevap! –