【问题标题】:what does this scala code do?这个scala代码是做什么的?
【发布时间】:2015-03-03 08:19:49
【问题描述】:

我还是 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 版本。

【问题讨论】:

  • 没有。正如我所提到的,我明白 => 意味着创建一个闭包。但我不明白这里的签名上下文
  • 这也意味着其他的东西,如该问题的第二个答案中所述。
  • (虽然一般情况可能在该问题中已充分涵盖,但我认为这实际上很难解析。我会尝试回答。)

标签: java scala


【解决方案1】:

所以。

首先要注意的是complete 是用def 声明的,所以它是一个方法,但是看起来可能是方法参数的括号出现在冒号@ 之后 987654325@.

所以它们实际上不是方法参数。 complete 是无参数方法!

那么冒号后面的括号是怎么回事?

(⇒ ToResponseMarshallable) ⇒ StandardRoute 是无参数方法完成的返回类型。函数complete返回一个函数,它接受ToResponseMarshallable 类型的表达式并返回一个StandardRoute

好的。但是函数签名 (⇒ ToResponseMarshallable) ⇒ StandardRoute 中的箭头 before ToResponseMarshallable 是怎么回事?

在函数签名中,类型名称前的 表示“call-by-name”参数。在 java 之后,Scala 默认计算参数列表中的所有表达式,然后计算方法体,用计算值替换变量。但是 Scala 还支持按名称调用语义,其中 表达式 被替换为未计算的函数,并在每次命名时重新执行。 complete 返回一个函数,其单个参数具有按名称调用的语义。

后面的等号只是这个方法的实现。以marshallable ⇒ 开头的表达式是匿名函数,或函数字面量,或 lambda(所有名称基本相同)。 marshallable ⇒ "hello" 将是一个接受(按名称)ToResponseMarshallable 并返回字符串“hello”的函数。但是我们需要一个接受ToResponseMarshallable(按名称)并返回StandardRoute的方法。所以我们有marshallable ⇒

只是一个匿名内部类,是 StandardRoute 的实现,它覆盖了其 apply 方法。

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

【讨论】:

  • 你说,complete返回一个接受StandardRoute类型表达式的函数,但是返回的函数不是return StandardRoute(而不是接受它)吗?跨度>
  • 啊!是的。让我解决这个问题并假装它没有发生。
  • 这就是,嗯,我的意思。
  • 很久没有仔细看Spray了。但看起来ToResponseMarshallable 只是一个可以编组为 HTTP 响应的东西的句柄。如果传递给complete 返回的函数的东西是通常传回的东西,XML 或 JSON 或纯文本字符串,我猜会有隐式转换到 ToResponseMarshallable 。如果你想传回特殊的东西,你必须定义转换。但我只是猜测! (参见stackoverflow.com/questions/28130260/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2019-02-27
  • 2015-12-23
相关资源
最近更新 更多