为什么在scala中的代码块之前给出了类名?

nto*_*nzz 3 syntax scala codeblocks

我是scala的新手,经历了一些教程,我遇到过一个样本

object DataController extends SomeOtherController with Controller {
...
    def testPage = SomeOtherAction { implicit requestHolder =>
        val userInfo = requestHolder.user 
        val paramMap = requestHolder.params
        .....
    }
}
Run Code Online (Sandbox Code Playgroud)

here = sign表示将以下代码块分配给名为testPage的函数.但为什么在代码块之前给出了类名"SomeOtherAction"?需要一些关于相同的指针.

ped*_*rla 7

SomeOtherAction实际上是一个对象,而不是一类,且必须有适用的方法.这个"代码块"不仅仅是一个块,它是一个采用requestHolder类型的函数.所以,SomeOtherAction可能就是这样

object SomeOtherAction {
  //...
  def apply(r:RequestHolder => Unit) = {
    // do something
    r(someRequestHolder) 
  }
}
Run Code Online (Sandbox Code Playgroud)

当Scala看到一个参数应用于一个对象时,它会寻求方法apply.

Unit以上的使用仅是一种可能情况的说明.

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

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

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