这在Scala中意味着什么?

时间:2016-02-08 13:22:34

标签: java scala oop functional-programming

我正在检查http4s库,并看到一些未知的语法。

val route = HttpService {
  case GET -> Root / "hello" =>
    Ok("Hello world.")
}

我查看了源代码,HttpService是一个对象,但其余部分是如何实现的?

3 个答案:

答案 0 :(得分:2)

在查看这样的代码时可能有用的一些信息:

  • 将对象或类作为函数调用,如果有一个
  • ,则调用相应的apply方法
  • 括号通常是可选的

所以重写上面代码的另一种方法是:

FPDF

正如Diego的回答所述,在这种情况下传递给应用的函数是从某种HTTP请求到某种HTTP响应。

答案 1 :(得分:1)

由于Scala在重载语法方面非常灵活,因此在没有任何上下文的情况下,您通常无法明确地知道实际发生了什么。

在这种情况下,“case”关键字是第一个提示,它只能出现在match-expressions和partial函数中,所以这个

{
  case GET -> Root / "hello" => Ok("Hello world.")
}

必须是部分功能。

这个函数显然是作为HttpService给出的某些方法或函数的参数传递的。在单个参数的情况下,可以放出括号。所以代码实际上意味着:

val route = HttpService({
  case GET -> Root / "hello" => Ok("Hello world.")
})

现在,如果正如您所说,HttpService是一个对象,则会调用其apply-method。 所以我希望在这个对象(或者它继承的某个类或特性)中找到一个apply method,其中一个参数采用函数或部分函数。

答案 2 :(得分:0)

您可能正在阅读依赖于Spray等基础框架的某种Web应用程序的代码。

该代码的作用是指定路由,即webapp的URL地址。

在特定情况下,您说如果您在服务器正在侦听的端口上获取http请求,类​​型为GET,对于URL“rootUrl / hello”,您应该以状态代码200响应(OK)并且您的回复内容应该是“Hello world”。字符串。