2016-09-06 51 views
6

我有一個方法,我想決定在map函數中返回什麼。我知道這可以通過分配一個變量來完成,但這是我儘管我可以做到的;Ruby Array中的`return`#地圖

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

如我所料,因爲第一次return被擊中,它從該方法返回,而不是在地圖功能,類似的回報是如何在JavaScript的地圖功能,這樣不會工作。

有沒有辦法實現我想要的語法?或者我需要將此分配給一個變量,並將其懸掛在末尾,如下所示:

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

回答

12

您不需要變量。塊的返回值是在其中計算的最後一個表達式的值。在這種情況下,if

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

三元運算符看起來更好,我想。更多的表達方式。

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

如果你堅持使用return,那麼你可以使用lambdas。在lambdas中,return的行爲與普通方法類似。

def some_method(array) 
    logic = ->(x) { 
    if x > 10 
     return x + 1 
    else 
     return x - 1 
    end 
    } 
    array.map(&logic) 
end 

雖然這種形式很少見。如果你的代碼很短,肯定可以重寫爲表達式。如果你的代碼很長且複雜到足以保證多個退出點,那麼你應該嘗試簡化它。

+0

不錯!我不得不重做我的代碼,但我相信這是一個很好的解決方案! – Automatico

+1

@ Cort3z:查看更新的答案:) –

15

Sergio的答案是非常好的,但它是值得指出的是,有的作品你想return的工作方式關鍵字:next

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

這不是一個很好用的next因爲,塞爾吉奧指出的那樣,你不需要任何那裏。不過,您可以使用next來更加簡潔地表達:

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

很好!我的實際代碼比我上面的例子更復雜,所以'next'可能是一個非常好的解決方案。就我個人而言,我不喜歡所有這種「默認情況下的魔法」行爲。明確說明發生了什麼是很好的,所以下一個人更容易接受。 – Automatico

+0

更好的答案! –