2013-01-11 7 views
4

Play! ,리터럴 함수의 암시 적 매개 변수

게다가

은 또한 당신이 요청에서 암시 적으로 세션을 검색 할 수 있습니다이 게시물을 읽어

def index = Action { implicit request => 
    session.get("connected").map { user => 
    Ok("Hello " + user) 
    }.getOrElse { 
    Unauthorized("Oops, you are not connected") 
    } 
} 

Documentationimplicit 설명 : 프레임 워크 문서는,이 조각 건너 온 : Literal with Implicit 그리고 논리적으로 함수는 암시 적 매개 변수를 가질 수 없습니다. 내가 잘 생각하면

, 이것은 항상 계약 (인터페이스)가방법에 반대 기능 때문에.

예를 들어, Function1[Int, Function1[Int, Int]]은 반환 유형의 첫 번째 매개 변수가 Int이므로이 매개 변수에 implicit으로 주석을 붙일 수 없습니다. 첫째 Action 년대에 필요한 매개 변수가 문자 그대로의 기능이기 때문에

따라서, 어떤 이전의 코드 조각은 암시 적으로 행동 ... () => Int 또는 Int => Int : 이것은 높은 수준의 반환 유형에 대한 혼란으로 이어질 것입니다. 두 번째 아무튼 이후
  • def apply(block: Request[AnyContent] => Result): Action[AnyContent]
  • def apply(block: => Result): Action[AnyContent]

    가 (첫 번째로 리디렉션)

:

나는 컴파일러는이 코드가 Action.apply() 방법의 여러 서명을 받아들이 할 수 있도록 이유를 추측 리터럴 함수의 암시 적 매개 변수가있는 경우이 매개 변수가 선택되어 있습니까? 이 기능을 경우

class MyImplicitClass(val session: Int) 
object Tester { 
    def apply(fun: MyImplicitClass => Int): Int = ??? 
    def apply(fun: => Int): Int = ??? 
} 
Tester { implicit myImplicitClass => session * 20} 

:

답변

6

다음 코드를 고려 명확하게 암시 적 매개 변수 myImplicitClass가 전달되기 때문에

def session(implicit myImplicitClass: MyImplicitClass): Int = myImplicitClass.session 

이 범위에, 다음 첫 번째 코드는 컴파일 기능session필드myImplicitClass.session에 액세스하여 필드 액세스를 생략 할 수 있습니다. 이것은 정확히 Play의 속임수입니다! 프레임 워크는 session 함수를 찾으려면 Controller을 확인하십시오. 하나 같이 폐쇄 매개 변수를 사용하고자

Tester { myImplicitClass => 
    implicit val x = myImplicitClass 
    session * 20 
} 

: 보조 노트로

은, 위의 폐쇄가 암시 적 매개 변수를 사용한다는 것은 아니며, 그것은 다음을 수행하는 것을 피하기 위해 언어 기능입니다 클로저의 본문에 포함 된 암시 적 값 또한 스칼라 2.9부터는이 트릭에 정확히 하나의 매개 변수가있는 클로저로 제한됩니다.

+0

Play가 없습니다.지금 나와 함께 컴퓨터에 설치, 그래서 불행히도 내가 플레이로 컴파일하는 이유를 더 이상 볼 수 없어!, 나는 놀이와 같은 계층 구조를 설정! 소스에서 찾을 수 없었고 "세션에서 암시 적으로 요청을 얻을 수 있습니다."다음에 요청에서 액세스를 중단하고 세션을 직접 참조 할 수 없음을 알 수 없었습니다 ... 이것은 설명서의 오류 일 수 있지만 정말로. –

+0

현재 내 대답에 대한 답변을 작성하고 있습니다. :) – Mik378

+0

'implicit request =>'는 내 예제에서'implicit test =>'와 같습니다. 또한, 대체 값으로 호출하는 것은 의미가 없습니다. 값이 아닌 함수의 매개 변수이기 때문입니다. 더 명확하게하기 위해 그것을 'myImplicitClass'로 변경했습니다. –

관련 문제