2016-08-08 2 views
2

나는 스칼라를 지금 배우고있다. 내가 좋아하는 한 가지 방법은 조기 반환입니다. 이전에 유효하지 않은 상태를 제거하기 만하면 모든 사람이 읽을 수 있다는 것을 확신합니다. 자, 스칼라가 함수형 언어이고 커팅 계산이 나쁜 함수 스타일이라는 것을 읽었습니다. 조기 반환과 동등한 트릭이나 함수 프로그래밍이 있는지 궁금합니다.스칼라로 조기 반환하는 방법

이 코드는 완전히 명확하게 작성했습니다.이 코드는 단지 멍청한 예일 뿐이며, 특별한 경우에 대한 특별한 해킹이 필요하지는 않습니다. 그러나 이러한 문제를 처리하는 방법에 대한 일반적인 조언이 필요합니다.

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

발생하는 오류는 익명의 함수 내에서 (재생'Action' 내에서)'return'을 사용하려고하기 때문에 발생합니다.), 익명 함수 대신 전체 메서드에서 반환됩니다. 이 경우 당신이 원하는 것을 할 수는 없지만 조기 반품은 좋은 습관이 아니기 때문에 위의 기사를 읽으시기 바랍니다. –

+0

'if ... else ...'로 대체 할 때 조기 반환은 대개 크기가 다른 조항으로 끝납니다. 간단한 해결책은 큰 방법을 별도의 방법으로 옮기는 것입니다. –

답변

2

return 키워드를 피할 수는 없지만 현재 문제가있는 것 같지 않습니다.

시나리오 1 : 귀하의 현재 시나리오가 단일 조건입니다. 이 경우 return을 매우 단순한 if else과 함께 사용하지 않아도됩니다.

세션을 설정하지 않는 것이 일반적인 문제인 경우 부분적인 기능으로 세션을 보호 할 수 있습니다.

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 : 브레이크 복귀를 사용하여 루프, 또는 소위 조기 복귀는 일반적으로 성능 향상 요소입니다.

스칼라에서 명백히 유효한 return의 사용은 피할 수없는 것처럼 보이는데, 첫 번째 항목에 대한 컬렉션을 반복하는 상황입니다. 분명히 당신은 collection.find을 사용하여 추상화 된 것을 가질 수 있고, 표준 lib에 미리 빌드되어있는 다른 도우미 메소드를 인수로 사용할 수 있습니다. 심지어이 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

나는 당신이 말하는 게시물을 알고 동의합니다. 이것은 스칼라를 처음 접하는 사람을 대상으로 한 것입니다. – flavian

+0

** 시나리오 2 ** : 꼬리 - 재귀가'find'에 맞지 않는다면, 또는 간단한'while' 루프. 'map' /'flatMap'의 반환은 항상 나쁜 것입니다 ('for'가 변환됩니다). –