ToResponseMarshallable

ToResponseMarshallable

我还是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方法。

我们完成了!我们(希望)了解所有内容以及此声明的含义。

10-06 15:58