2016-09-06 8 views
6

私はマップ関数内で何を返すのかを決めたいメソッドがあります。変数を割り当てることでこれを行うことができると私は認識していますが、これは私がそれを行うことができる方法です。Ruby Array#mapの `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 

3進演算子はよりよく見えると思います。より多くの表現 - ish。

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

returnを使用するとしたら、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

セルジオの答えは非常に良いですが、それはあなたが動作するようにreturnを望んでいたように動作しますキーワードがあることを指摘する価値がある:next

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

セルジオが指摘したように、あなたはそこに何を必要としない、ので、これはnextの非常に良い使用ではありません。ただし、nextを使用すると、より簡潔に表現できます。

+1

それはいいです!私の実際のコードは上記の例よりも複雑ですので、 'next'はとても良い解決策になります。個人的に私はルビーのこの "すべてのデフォルト"の動作が気に入らない。何が起こっているのかを明示的に述べることはうれしいので、次の人がそれを拾うのがより簡単です。 – Automatico

+0

はるかに良い答えです! –

関連する問題