我还是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版本很高兴看到。
答案 0 :(得分:3)
所以
首先要注意的是complete
是用def
声明的,所以它是一个方法,但看起来像是方法参数的括号来自之后的 >冒号:
。
所以他们实际上不是方法论证。 complete
是一种无论证的方法!
然后结肠后的parens是什么?
(⇒ ToResponseMarshallable) ⇒ StandardRoute
是完成no-arg方法的返回类型。函数complete
返回一个函数,它接受ToResponseMarshallable
类型的表达式并返回StandardRoute
。
行。但是,在函数签名ToResponseMarshallable
(⇒ ToResponseMarshallable) ⇒ StandardRoute
之前的箭头是什么?
在功能签名中,类型名称前面的⇒
表示" call-by-name"论点。在java之后,Scala默认评估参数列表中的所有表达式,然后计算方法体,用变量的计算值替换。但Scala还支持按名称调用语义,其中表达式被替换为未评估的函数,并在每次命名时重新执行。 complete
返回一个函数,其单个参数具有按名称调用的语义。
遵循等号只是这种方法的实现。以marshallable ⇒
开头的表达式是匿名函数,函数文字或lambda(所有名称基本相同)。 marshallable ⇒ "hello"
将是一个接受(通过名称)ToResponseMarshallable
并返回String" hello"的函数。但我们需要一种接受ToResponseMarshallable
(按名称)并返回StandardRoute
的方法。我们有marshallable ⇒
<表达式,评估为StandardRoute>
<表达式,评估为StandardRoute> 只是一个匿名内部类,StandardRoute
的实现覆盖其apply
方法。
我们已经完成了!我们(希望)理解所有的部分,以及这个声明的含义。