4

暗黙のvalmyConnectionをexecute(true)関数のスコープに入れるにはどうすればよいですか?

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
}
4

1 に答える 1

5

これを直接行うことはできません。の値は、myConnection呼び出す前に本当に決定されていませんexecuteか? この場合、これを行うことができます:

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() 
}

基本的に、評価された関数にパラメーターを渡しますが、呼び出しサイトで暗黙的にマークすることを忘れないでください。

このような Implicit が複数ある場合は、それらを専用の「Implicit プロバイダー」クラスに配置することをお勧めします。例えば:

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ように記述できます。

implicit def getMyConnection(implicit impl: PassedImplicits) = impl.myConnection

execute(true) { implicit impl =>
  useMyConnection() 
}
于 2012-04-04T13:30:28.113 に答える