这个问题严格来说是关于 Scala 语法的,尽管它包含一些来自 akka 的代码(例如)。
我对 Scala 很陌生。深入研究 akka 的源代码,我想出了以下非常奇怪的方法:
def transform[C]
(f: ExecutionContext ⇒ Materializer ⇒ Future[B] ⇒ Future[C]): Unmarshaller[A, C] =
Unmarshaller.withMaterializer { implicit ec ⇒ implicit mat ⇒ a ⇒ f(ec)(mat)(this(a)) }
在哪里
Unmarshaller.withMaterializer
定义为 def withMaterializer[A, B](f: ExecutionContext ⇒ Materializer => A ⇒ Future[B]): Unmarshaller[A, B]
这里发生了什么?什么是恐怖功能
f: ExecutionContext => Materializer => Future[B] => Future[C]
.我觉得更奇怪的是 implicit
的序列。 s: implicit ec => implicit mat => a => f(ec)(mat)(this(a))
虽然 withMaterializer
根本没有隐式参数。在这样的序列中隐含的意思是什么?
最佳答案
f: ExecutionContext => Materializer => Future[B] => Future[C]
只不过是一个柯里化(Currying)函数,所以你把它叫做 f(ec)(mat)(this(a))
具有多个参数列表(好吧,从技术上讲,参数列表不属于与 def f(...)(...)
相同的函数,但这些都是细节)。换句话说f
可以写成:
f: ExecutionContext => { Materializer => { Future[B] => Future[C] } }`
(返回一个函数的函数,它返回另一个函数)
现在,如果您查看
f(ec)(mat)(this(a))
有电话this(a)
,在 transform
上方定义:def apply(value: A)(implicit ec: ExecutionContext, materializer: Materializer): Future[B]
(
this(a)
只是对 this.apply(a)
的调用)。现在apply
有两个隐式参数,即ec: ExecutionContext
和 materializer:Materializer
,所以称它为 this(a)
你需要两个隐式值。究竟是什么定义implicit ec ⇒ implicit mat ⇒ a ⇒ f(ec)(mat)(this(a))
方法。它声明 ec
和 mat
作为所有嵌套函数体的隐含,所以 this(a)
可以接他们。另一种可能性是写:ec ⇒ mat ⇒ a ⇒ f(ec)(mat)(this(a)(ec, mat))
关于scala - 理解scala中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454430/