繁体   English   中英

Scala和Akka函数文字? 需要帮助来理解功能模式的语言

[英]scala and akka function literal ? need help in understanding the language of functional pattern

entity(as[ConnectionData]) { connection_data =>

我试图在上面的代码片段示例中理解,connection_data是语言方面的 (因为我是scala的新手)如何将未编组的实体函数的结果放入其中。 还是这里的connection_data表示以后我可以做

m_client_id = connection_data.clientId
val port = connection_data.port

connection_data在哪里设置,绑定等

Akka文档 (或更确切地说, 解编 )在解释编组(这是数据的序列化/整理的同义词)方面做得非常出色:

“编组”是将较高级别的(对象)结构转换为某种较低级别的表示形式(通常是“有线格式”)的过程。 其他流行的名称是“ Serialization”或“ Pickling”。

在Akka HTTP中,“封送处理”是指将类型T的对象转换为较低级别的目标类型,例如,MessageEntity(形成HTTP请求或响应的“实体”)或完整的HttpRequest或HttpResponse。

Akka试图做的是查看MessageEntity主体,该主体基本上是HTTP请求提供的有效负载,并尝试使用内置的“反序列化器”(由您自己定义)对它进行反序列化。

此代码的含义:

entity(as[ConnectionData]) { connection_data =>

是Akka框架尝试将HTTP请求中收到的有效负载反序列化为ConnectionData对象。 如果成功,那么下一步将是调用其中connection_dataConnectionData类型的实例的函数,您可以在代码中使用该函数。 Akka-HTTP利用spray-json进行内置编组,例如,可能的ConnectionData反序列化器如下所示:

case class ConnectionData(host: String, port: Int)

object ConnectionData extends DefaultJsonProtocol {
  implicit val connectionFormat = jsonFormat2(ConnectionData.apply)
}
def someFunction(a:Int)(b:Int => Int) = {
  a + b(2)
}

someFunction(1){ x =>
  x * 2
}

基本上,它是一个作为参数传递的函数。 在这种情况下,someFunction是实体方法。 x => x * 2是conction_data => ...部分。 看一下实体功能的定义。

另外,您可以将其写在单个括号中”,但是对于带有大括号的调用,您需要进行一些处理:

def someFunction(a:Int,b:Int => Int) = {
  a + b(2)
}

def someFunctionCurried(a:Int)(b:Int => Int) = someFunction(a, b)
def someFunctionCurried2(a:Int) = someFunction(a, _:Int => Int)

someFunctionCurried(3){ x => x * 2 }
someFunctionCurried2(4){ x => x * 2}

这是咖喱函数someFunction的两种方法,在第二个示例中,该函数具有一组单独的括号。

另外,def和val之间有区别。 您可以像下面这样咖喱函数:

val someFunctionCurried = (a:Int) => (b:Int => Int) => someFunction(a, b)
val someFunctionCurried2 = (a:Int) => someFunction(a, _:Int => Int)

如果您看一下前面的示例(使用def),编译器将为您执行该步骤,或者您可以直接使用val。 但是使用val时,您需要知道它在定义时(尽可能)进行评估,并在每次使用时进行def评估。

我的意思是:“编译器将为您执行该步骤”? 非常简单。 对于高阶函数(hof),编译器会将您的方法(def)变为函数(val)。 因此,您还可以在语法上弄清楚语义上的区别。 但是,有更多文献和更多示例,希望对您有所帮助。

但是至少您可以坚持使用“ def”,以免被val混淆以进行函数定义,因为编译器可以解决该问题。 显然,在某些情况下,val在性能方面更有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM