Scala 2.10 futures を使用して非同期ライブラリを作成しています。ライブラリのコンストラクターは、特定の特性を実装する一連のユーザー定義オブジェクトを受け取り、ライブラリ クラスのメソッドがデータをユーザー定義オブジェクトに 1 つずつ送信します。ExecutionContext
メイン インスタンスを設定するときにユーザーが非同期操作を提供し、必要に応じてそのコンテキストがユーザー定義オブジェクトに渡されるようにする必要があります。簡略化された (疑似?) コード:
case class Response(thing: String)
class LibraryObject(stack: Seq[Processor])(implicit context: ExecutionContext) {
def entryPoint(data: String): Future[Response] = {
val response = Future(Response(""))
stack.foldLeft(response) { (resp, proc) => proc.process(data, resp) }
}
}
trait Processor {
def process(data: String, resp: Future[Response]): Future[Response]
}
次のように使用できます。
class ThingProcessor extends Processor {
override def process(data: String, response: Future[Response]) = {
response map { _.copy(thing = "THE THING") }
}
}
class PassThroughProcessor extends Processor {
override def process(request: Request, response: Future[Response]) = {
response
}
}
object TheApp extends App {
import ExecutionContext.Implicits.global
val stack = List(
new ThingProcessor,
new PassThroughProcessor
)
val libObj = new LibraryObject(stack)
val futureResponse = libObj.entryPoint("http://some/url")
// ...
}
次のコンパイル エラーが発生しますThingProcessor
。
暗黙の ExecutionContext が見つかりません。自分で必要とするか、インポートしてください
ExecutionContext.Implicits.global
私の質問は、ユーザー (クラスを作成する予定のユーザー) に心配させることなく、ユーザー定義オブジェクト ( and ) またはそれらのメソッドに必要ExecutionContext
なを暗黙のうちに指定するにはどうすればよいかということです。ユーザーは次のように入力する必要はありませんでした。LibraryObject
ThingProcessor
PassThroughProcessor
class MyFirstProcessor(implicit context: ExecutionContext)
また
override def process(...)(implicit context: ExecutionContext) = { ... }