我有一个这样的函数:
def getSomething: (String, Future[String]) => String = {
case (name, surname) if (name == "Joe", surname.map(s => s == "Doe")) => "Is ok"
}
但编译器说他需要map
函数中的executionContext
。我试着用做一些魔术
def getSomething (implicit e: ExecutionContext): (String, Future[String]) => String{...}
或
def getSomething: (String, Future[String])(implicit e: ExecutionContext) => String{...}
但它不起作用。有可能将隐式参数传递给这样的函数吗?或者我可以换一种方式吗?
def getSomething (implicit e: ExecutionContext): (String, Future[String]) => String = ...
应该起作用。
你不能写
(String, Future[String]) => (implicit e: ExecutionContext) => String
隐式函数将出现在Scala 3中。
http://dotty.epfl.ch/docs/reference/contextual/context-functions.html
http://dotty.epfl.ch/blog/2016/12/05/implicit-function-types.html
在Scala 3中,我们可以返回一个带有隐式参数的函数,例如
def getSomething: ExecutionContext ?=> Future[String] => Future[Int] = {
(using ec: ExecutionContext) => (f: Future[String]) => f.map(_.toInt)
}
given fiveThreadsEc as ExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(5))
getSomething(Future("42"))
注意函数类型中的?=>
与函数文字中的using
是如何对应的。考虑上下文函数#8305 从Change到(using x: T) => E
的示例
val f: Int ?=> Int = (using x: Int) => 2 * x
f(using 2)