2017-12-23 2 views
2

괄호 대신 코드 블록을 Action에 전달할 수 있습니까? 이 구문을 이해할 수 없습니다. 아니 내가 ()Play의 Action 메소드 구문을 이해할 수 없음

val echo = Action { request => 
    Ok("Got request [" + request + "]") 
} 

를 사용해야 나는 ActionFunction1 가정하자. 스칼라에서 다음의 예는, ()을 사용하므로 {}

object Main extends App { 
    val succ = (x: Int) => x + 1 //create Function 1 
    val anonfun1 = new Function1[Int, Int] { //create another Function1 
    def apply(x: Int): Int = x + 1 
    } 
    assert(succ(0) == anonfun1(0)) //notice use of() 
} 

Action 작품은 나중에 대신 {}()를 사용하여 테스트하는 방법과 코드는 여전히 작동합니다. 따라서 가독성을 높이기 위해 {}을 사용하고 있습니까? 스칼라에서

val echo = Action (request => 
    Ok("Got request [" + request + "]") 
) 
+1

[Play 프레임 워크의 코드에 대한 혼란] 가능한 복제본 (https : // stackove rflow.com/questions/27664675/confusion-about-play-frameworks-code) –

+0

먼저 [documentation] (https://www.playframework.com/documentation/latest/ScalaActions) – cchantep

답변

1

은 괄호와 중괄호는 다양한 시나리오 function`s 인수 목록에서 래퍼 ()되고 그들 중 하나에 교환 할 수있다. 당신이 스칼라에 대한 자세한 내용을 읽을 필요가 같은

multiply{ 
    val num = 5 
    num 
}{ 
    val by = 2 
    by 
} 
+1

을 읽어주십시오. 괄호와 중괄호는' 어떤 시나리오에서든 스칼라에서는 서로 호환되지 않습니다. 스칼라가 여러 가지 방법으로 동일한 것을 작성했기 때문입니다. –

4

가 보이는 : 멀티 라인 표현이 내부에 기록 될 수 있도록

def multiply(num: Int)(by: Int): Int = num * by 

multiply(5)(2) 
multiply{5}{2} 

중괄호 구문

도 있습니다.

먼저 여기에, 기본으로

scala> val a = 5 
// a: Int = 5 

을 시작하자의 RHS는 5이며 expression eiteral 또는 literal expression이라고합니다.

마찬가지로 스칼라 또한 RHS가 { 5 }이며 block expression 호출이 block 여기 5로 평가되고, 여기서,

scala> val a = { 5 } 
// a: Int = 5 

있습니다.

이제, 우리의 유스 케이스 지금

scala> object A { 
    | def apply(i: Int) = i + 5 
    | } 
// defined module A 

로 이동하자, 스칼라,

val x1 = A(10) 
// x1: Int = 15 

// Or 
val x2 = A { 10 } 
// x2: Int = 15 

왜 우리가 두 가지 방법이 A을 사용할 수 있습니다? 스칼라 언어 사양을 살펴보십시오 - 우리가 다음 우리가 어떤 Expr (심지어 여러)을 제공 할 수있는 기능을 적용 할 ()를 사용하는 경우, 그래서, 당신은 다음과 같은 문법을 볼 수 있습니다, 여기에

SimpleExpr ::= SimpleExpr1 ArgumentExprs 
ArgumentExprs ::= ‘(’ [Exprs] ‘)’ 
       | ‘(’ [Exprs ‘,’] PostfixExpr ‘:’ ‘_’ ‘*’ ‘)’ 
       | [nl] BlockExpr 
Exprs   ::= Expr {‘,’ Expr} 

Functional Application

을 그렇지 않으면 우리는 이제 BlockExpr

를 제공해야 (설명 간체) 귀하의 예제에 대해 이야기 할 수

val echo = Action(request => Ok("")) 

// VS 

val echo = Action { request => Ok("") } 

파서가 파싱하는 방법에 차이가 있습니다.

다음과 같은 규칙에 첫 진행에 대한 분석, 두 번째는 다음과 같은 규칙을 사용

SimpleExpr  ::= SimpleExpr1 ArgumentExprs 
ArgumentExprs  ::= ‘(’ [Exprs] ‘)’ 
Exprs    ::= Expr {‘,’ Expr} 
Expr    ::= (Bindings | [‘implicit’] id | ‘_’) ‘=>’ Expr 

,

SimpleExpr  ::= SimpleExpr1 ArgumentExprs 
ArgumentExprs  ::= [nl] BlockExpr 
BlockExpr   ::= ‘{’ Block ‘}’ 
Block    ::= BlockStat {semi BlockStat} [ResultExpr] 
ResultExpr  ::= (Bindings | ([‘implicit’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block 
Block    ::= BlockStat {semi BlockStat} [ResultExpr] 
BlockStat   ::= Expr1 

전체 구문 분석 트리 표현,

enter image description here

관련 문제