2

here で説明されているように Future を作成できません。Future次のコードを使用して直接作成できると書かれています。

import akka.dispatch.Await
import akka.dispatch.Future
import akka.util.duration._

val future  = Future {
  "Hello" + "World"
}
val result = Await.result(future, 1 second)

まったく同じコードを使用すると、次のようなエラー メッセージが表示されますerror: could not find implicit value for parameter executor: akka.dispatch.ExecutionContext。私が見つけることができるのExecutionContextは、それで「何かをする」ことができるということだけです。ドキュメントで、私が見つけた唯一の行は次のとおりです。

implicit val ec = ExecutionContect.fromExecutionService(yourExecutionServiceGoesHere)

しかし、これは私には役に立ちませんでした。そのトピックに関する提案はありますか?Future質問せずに新しいを作成するにはどうすればよいActorですか?

4

2 に答える 2

7

あなたが持っているなら、ActorSystemそれはExecutionContextここで使うことができるものを持っているでしょう。implicitメソッドに明示的に渡さない限り、でなければなりませんFuture.apply

デモンストレーションの目的で、これがREPLでどのように機能するかを確認したいだけの場合は、次のようにします。

implicit val system = ActorSystem("MySystem").dispatcher

ActorSystem => ExecutionContext(オブジェクトには暗黙の変換もありExecutionContextます。)

使用ポイントの直前にコンテキストを作成せずにモジュラーコードを作成するには、コンテキストをトレイトの抽象メンバーにすることを検討してください。

trait MyFutures {
  implicit val context: ExecutionContext

  def helloFuture: Future[String] = Future { "hello" + "world" }
}
于 2013-01-11T10:26:28.623 に答える
3

違法な Scala コードを書いているため、コードはコンパイルされません: の署名はFuture.applyそれを明確に示しています。トレイト Future のコンパニオン オブジェクトの apply メソッドを呼び出していることを理解していると思います。これは次のとおりです。

object Future extends java.lang.Object with scala.ScalaObject {
  def apply[T](body : => T)(implicit executor : akka.dispatch.ExecutionContext) : akka.dispatch.Future[T] = { /* compiled code */ }
}

ExecutionContextを呼び出すときに暗黙的に使用できるものがないFuture.applyため、コンパイル エラーが発生します。1 つだけを指定すると、2 つのパラメーターを受け取るメソッドを呼び出すのと同じです。

を作成する方法の問題ExecutionContextは異なり、Akka のドキュメントで答えを見つけることができます。

コールバックと操作を実行するために、Future には ExecutionContext と呼ばれるものが必要です。これは、java.util.concurrent.Executor に非常によく似ています。スコープ内に ActorSystem がある場合、デフォルトのディスパッチャーを ExecutionContext として使用するか、Executor と ExecutorService をラップするために ExecutionContext コンパニオン オブジェクトによって提供されるファクトリ メソッドを使用するか、独自のメソッドを作成することもできます。

于 2013-01-11T10:39:45.143 に答える