私はScala 2.10先物を使用して非同期ライブラリを作成しています。ライブラリのコンストラクタは、特定の特性を実装する一連のユーザー定義オブジェクトを受け取り、ライブラリクラスのメソッドは、ユーザー定義オブジェクトにデータを1つずつ送信します。メインインスタンスを設定するときに非同期操作のためにExecutionContext
を提供し、そのコンテキストが必要に応じてユーザー定義オブジェクトに渡されるようにします。簡素化された(?擬似)コード:含めるオブジェクト/呼び出されたメソッドに暗黙の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
私はExecutionContext
のLibraryObject
がユーザー定義オブジェクト(ThingProcessor
とPassThroughProcessor
)またはそのメソッドに暗黙的に(クラスを作成する)ユーザーに気にせずに提供することはできますか?
class MyFirstProcessor(implicit context: ExecutionContext)
または
override def process(...)(implicit context: ExecutionContext) = { ... }
これはシングルトンオブジェクトではありませんが、明らかに回避策はありますか? –
@ pagoda_5bあなたはアップデートのような意味ですか?私がはっきりと考えていないならば、事前に謝罪してください。 –
うん、かなり滑らかに見えて、私はそれが好きです。 –