3

我是 scala 的新手,浏览了一些教程,在一个示例中我遇到了

object DataController extends SomeOtherController with Controller {
...
    def testPage = SomeOtherAction { implicit requestHolder =>
        val userInfo = requestHolder.user 
        val paramMap = requestHolder.params
        .....
    }
}

这里 = 符号表示将以下代码块分配给名为 testPage 的函数。但是为什么在代码块之前给出了一个类名“SomeOtherAction”?需要一些关于相同的指示。

4

1 回答 1

8

SomeOtherAction实际上是一个对象,而不是一个类,并且必须有一个 apply 方法。这个“代码块”不仅仅是一个块,它是一个接受 requestHolder 类型的函数。所以,SomeOtherAction可能是这样

object SomeOtherAction {
  //...
  def apply(r:RequestHolder => Unit) = {
    // do something
    r(someRequestHolder) 
  }
}

当 Scala 看到一个参数被应用到一个对象时,它会寻找方法 apply。

上述的使用Unit只是一种可能情况的说明。

难题的最后一块是,对于任何方法,包括apply,参数表达式可以由括号包围,或者(如果只有 1 个)可以是单个块表达式,即由大括号包围{}。这在函数应用程序语法的语言规范第 6.6 节中有详细说明:

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

例如def foo(x: Int) = x * 100可以通过foo(42)或 调用foo {println("yo"); 42}

于 2013-07-13T09:35:31.570 回答