我还是Scala的新手。
我在Spray框架中找到了这段代码。
我试图了解方法签名的含义:
/**
* Completes the request using the given arguments.
*/
def complete: (⇒ ToResponseMarshallable) ⇒ StandardRoute = marshallable ⇒ new StandardRoute {
def apply(ctx: RequestContext): Unit = ctx.complete(marshallable)
}
=>
运算符在这里做什么?我以为是用来创建关闭的?在这里完成可编组的任务是什么?为什么要在括号之外做?
这段代码的Java版本很高兴看到。
最佳答案
所以。
首先要注意的是complete
是用def
声明的,所以它是一个方法,但是看起来像是方法参数的括号在冒号:
之后。
因此,它们实际上不是方法参数。 complete
是无参数方法!
那结肠后的括号怎么了?(⇒ ToResponseMarshallable) ⇒ StandardRoute
是no-arg方法complete的返回类型。函数complete
返回一个函数,该函数接受ToResponseMarshallable
类型的表达式并返回StandardRoute
。
好。但是,函数签名ToResponseMarshallable
中(⇒ ToResponseMarshallable) ⇒ StandardRoute
之前的箭头是怎么回事?
在函数签名中,类型名称之前的⇒
表示“call-by-name”参数。在Java之后,Scala默认情况下会评估参数列表中的所有表达式,然后评估方法主体,将评估值替换为变量。但是Scala还支持按名称调用的语义,在这种语义中,一个表达式被替换为不求值的函数,并在每次命名时重新执行。 complete
返回一个函数,该函数的单个参数具有按名称调用的语义。
等号后面就是此方法的实现。以marshallable ⇒
开头的表达式是一个匿名函数,函数文字或lambda(所有名称基本上都相同)。 marshallable ⇒ "hello"
将是一个(按名称)接受ToResponseMarshallable
并返回字符串“hello”的函数。但是我们需要一种方法,该方法接受ToResponseMarshallable
(按名称)并重新调整StandardRoute
。因此,我们有了marshallable ⇒
该只是一个匿名内部类,它是StandardRoute
的实现,它覆盖了其apply
方法。
我们完成了!我们(希望)了解所有内容以及此声明的含义。