[英]How to get Implicit parameter into an anonymous function
如何将隐式 val myConnection 放入 execute(true) function 的 scope
def execute[T](active: Boolean)(blockOfCode: => T): Either[Exception, T] = {
implicit val myConnection = "how to get this implicit val into scope"
Right(blockOfCode)
}
execute(true){
// myConnection is not in scope
useMyConnection() // <- needs implicit value
}
你不能直接这样做。 调用execute
之前真的没有确定myConnection
的值吗? 在这种情况下,您可以这样做:
def execute[T](active: Boolean)(blockOfCode: String => T): Either[Exception, T] = {
val myConnection = "how to get this implicit val into scope"
Right(blockOfCode(myConnection))
}
execute(true) { implicit connection =>
useMyConnection()
}
基本上,您将一个参数传递给已评估的 function,但您必须记住在调用站点将其标记为隐式。
如果你有几个这样的隐式,你可能想把它们放在一个专用的“隐式提供者”class 中。例如:
class PassedImplicits(implicit val myConnection: String)
def execute[T](active: Boolean)(blockOfCode: PassedImplicits => T): Either[Exception, T] = {
val myConnection = "how to get this implicit val into scope"
Right(blockOfCode(new PassedImplicits()(myConnection)))
}
execute(true) { impl =>
import impl._
useMyConnection()
}
如果你想避免import
,你可以为PassedImplicits
中的每个字段提供“隐式 getters” 并编写如下内容,然后:
implicit def getMyConnection(implicit impl: PassedImplicits) = impl.myConnection
execute(true) { implicit impl =>
useMyConnection()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.