2017-09-14 115 views
1

我一直无法确定下面的代码代表什么,因为这些语法没有完全列在Scala文档中。有人可以在下面的每一行上说明一些情况吗?如果上述标题需要更改为可以使他人受益的内容,请告诉我。Scala编码风格

val route = 
    path("hello") { 
    get { 
     complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Say hello to akka-http</h1>")) 
    } 
    } 

编号: http://doc.akka.io/docs/akka-http/current/scala/http/introduction.html#http-client-api

+0

你可以作为对* *什么语法,你不明白,更精确?这里有一个变量声明,两个字符串文字和4个方法调用。你知道什么是方法吗?你知道什么是方法调用吗?你知道一个字符串是什么吗?你知道文字是什么吗?你知道字符串是什么吗?你知道变量是什么吗? –

+0

Jörg - 我理解Java格式,但上述语法对于如何理解它没有意义。对于例如是否得到了一个方法,是否被上面定义的人体覆盖,等价表示如何使其看起来像传统方式(例如get(){})。

路径( “你好”){} 路径( “你好”){获得{}} 路径( “你好”){获得{完整(HttpEntity(,))}}

Kumar

回答

2

这些是call-by-name参数,这些参数在Scala语言规范中的不同点描述。基本上,如果你有这样的声明:

def path[R](string: String)(body: => R): R = ... 

,您将需要提供一个字符串和代码body)块,这是呼叫按姓名块。在这种情况下,如果body返回R类型的结果,那么将推断返回类型path。因此,该方法可称为:

path("hello") { 
    "world" 
} 

直到使用该名称块才被调用。

这里是一个很好的解释由罗布·诺里斯:https://tpolecat.github.io/2014/06/26/call-by-name.html

2

正如你可能知道,这是在阿卡HTTP路由定义。他们在akka documentation中有很好的描述。这种特殊的路线的工作方式如下:

  • path("hello"){...} - 即验证路径
  • get{...}一个指令 - 用于验证HTTP动词(方法) 所以它转换得到一个指令/你好
  • complete(HttpEntity(...))是一个回应。
+0

感谢从阿卡回答界面视角。 – Kumar