2016-08-08 6 views
2

私は現時点でScalaを学習しています。私がしたいことの一つは、早期復帰です。以前は無効な状態を取り除くだけで、誰もが読むことがはるかに簡単だと私は確信しています。さて、Scalaは関数型言語であり、カッティング計算が機能的でないことを読んだことがあるので、早期復帰に相当するトリックや関数型プログラミングがあるかどうか疑問に思っています。Scalaで早く復帰する方法

これは私が書いたコードですが、これはちょっとばかりの例で、私は特別なケースの特別なハックを探しているわけではありませんが、これに対処するための一般的なアドバイスをしています。

if (request.headers.get(session_header).isEmpty) { 
    BadRequest(session_not_set) 
} else { 
    Ok(CartHelper.getCart(session, user)) 
} 

今、何を私が行うことに誘惑だことは次のとおりです。

if (request.headers.get(session_header).isEmpty) { 
    BadRequest(session_not_set) 
    return; 
} 

Ok(CartHelper.getCart(session,user)) 

あなたは私のための任意のヒントを持っている場合は!

+3

https://tpolecat.github.io/2014/05/09/return.html –

+0

あなたが遭遇しているエラーは、匿名関数内で 'return'を使用しようとしているためです(Play' Action'内)、これは無名関数の代わりにメソッド全体から返されます。この場合、あなたが望むことをすることは不可能ですが、早期返品は良い習慣ではないので、上記の記事を読むことをお勧めします。 –

+0

初期のリターンは、通常、 'if ... else ...'と置き換えると、サイズが大きく違ってしまいます。シンプルなソリューションは、大きなメソッドを別のメソッドに移動することです。 –

答えて

2

returnキーワードは避けることはできませんが、現時点で問題があるようには見えません。

シナリオ1:単一の条件シナリオ、あなたの現在のシナリオ。この例では、を非常に単純なif elseで使用することを避けることができます。

def doSomething: AnyContent = { 
    if (request.headers.get(session_header).isEmpty) { 
    BadRequest(session_not_set) 
    } else { 
    Ok(CartHelper.getCart(session,user)) 
    } 
} 

セッションが設定されていない場合は、一般的な問題ですが、部分的な機能で周囲をガードすることができます。

def requireSession(req: Request)(
    pf: Session => AnyContent 
): AnyContent = { 
    request.headers.get(session_header) 
    .fold(BadRequest("Session not set"))(pf(_)) 
} 

そして:

// Assuming Play framework being used here 
def getCart: AnyContent = Action { implicit req => 
    requireSession(req) { session => Ok(CartHelper.getCart(session, user) } 
} 

シナリオ2:ブレークリターンを使用してループ、またはいわゆる早期復帰は、通常、性能向上要素です。

Scalaで明らかに有効な使用方法の1つは、何かの最初のコレクションを反復している状況です。明らかに、collection.findと他のヘルパーメソッドを標準ライブラリで事前ビルドすることで抽象化することができますが、議論のためです。これでもreturnような状況で

def inList[T](l: List[T], value: T): Boolean = { 
    for (el <- l) { 
    // break the loop for the first match found 
    // for the sake of efficiency. 
    if (el == value) return true; 
    } 
    false; 
} 

は異なる構文を使用することにより、回避され、そしてあなたがダンの反復内return明らかに不可能を置き換えるために使用することができます何かの再帰バージョンは、常にあります。

+0

'return'を使う常に避けてください。 https://tpolecat.github.io/2014/05/09/return.html –

+0

私は同意し、あなたが言及している投稿を知っています。これは、Scalaを初めてお使いの方に丁寧に説明されています。 – flavian

+0

**シナリオ2 **: 'find'に収まらない場合はtail-recursion、または単純な' while'ループです。 'map' /' flatMap'からの戻りは常に悪いことです( 'for'が変換されます)。 –

関連する問題