scala 和作为函数文字?需要帮助来理解功能模式的语言
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 documentation (or more specifically, unmarshalling) 很好地解释了编组(这是 serialization/pickling 数据的同义词):
"Marshalling" is the process of converting a higher-level (object)
structure into some kind of lower-level representation, often a "wire
format". Other popular names for it are "Serialization" or "Pickling".
In Akka HTTP "Marshalling" means the conversion of an object of type T
into a lower-level target type, e.g. a MessageEntity (which forms the
"entity body" of an HTTP request or response) or a full HttpRequest or
HttpResponse.
Akka 试图做的是查看 MessageEntity
主体,它基本上是 HTTP 请求提供的有效负载,并尝试使用它内置的 "deserializers" 反序列化它,你自己定义。
此代码的含义:
entity(as[ConnectionData]) { connection_data =>
Akka 框架是否试图将 HTTP 请求中接收到的负载反序列化为 ConnectionData
对象。如果成功,下一步将调用函数,其中 connection_data
是 ConnectionData
类型的实例,您可以在代码中使用它。 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 是 conection_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 每次使用时。
我的意思是:"The compiler will do that step for you"?
非常简单。关于高阶函数 (hof),编译器会将您的方法 (def) 转换为函数 (val)。所以还有一个语义差异,您可以在语法中弄清楚。但是有更多的文献和更多的例子,我希望这对你有帮助。
但至少您可以坚持使用 "def",以免被函数定义的 val 搞糊涂,因为编译器会解决这个问题。显然,有些情况下 val 在性能方面更有意义。
entity(as[ConnectionData]) { connection_data =>
我试图在上面的代码片段示例中理解 connection_data、 语言明智 (因为我是 scala 的新手)如何获得结果在未编组的实体函数中。或者这里的 connection_data
表示以后我可以做什么
m_client_id = connection_data.clientId
val port = connection_data.port
connection_data 在哪里设置、绑定等
Akka documentation (or more specifically, unmarshalling) 很好地解释了编组(这是 serialization/pickling 数据的同义词):
"Marshalling" is the process of converting a higher-level (object) structure into some kind of lower-level representation, often a "wire format". Other popular names for it are "Serialization" or "Pickling".
In Akka HTTP "Marshalling" means the conversion of an object of type T into a lower-level target type, e.g. a MessageEntity (which forms the "entity body" of an HTTP request or response) or a full HttpRequest or HttpResponse.
Akka 试图做的是查看 MessageEntity
主体,它基本上是 HTTP 请求提供的有效负载,并尝试使用它内置的 "deserializers" 反序列化它,你自己定义。
此代码的含义:
entity(as[ConnectionData]) { connection_data =>
Akka 框架是否试图将 HTTP 请求中接收到的负载反序列化为 ConnectionData
对象。如果成功,下一步将调用函数,其中 connection_data
是 ConnectionData
类型的实例,您可以在代码中使用它。 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 是 conection_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 每次使用时。
我的意思是:"The compiler will do that step for you"? 非常简单。关于高阶函数 (hof),编译器会将您的方法 (def) 转换为函数 (val)。所以还有一个语义差异,您可以在语法中弄清楚。但是有更多的文献和更多的例子,我希望这对你有帮助。
但至少您可以坚持使用 "def",以免被函数定义的 val 搞糊涂,因为编译器会解决这个问题。显然,有些情况下 val 在性能方面更有意义。