这个scala代码有什么作用?

时间:2015-03-03 08:19:49

标签: java scala

我还是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版本很高兴看到。

1 个答案:

答案 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方法。

我们已经完成了!我们(希望)理解所有的部分,以及这个声明的含义。