1

私はAkkaとscalaを使用しています。そのため、コードで system.actorOf または context.actorOf を呼び出しています。ただし、特定の機能を追加できるように、アクター作成用に Akka のライブラリをラップしています。そのため、高レベルの抽象化をどちらのコンテキストでも機能させる方法で問題が発生します。システムが使用可能な環境内 (テスト コード内およびアプリのカーネル) で呼び出されるか、アクター内で呼び出されるか (コンテキスト変数にのみアクセスできます)。

これを一緒に平手打ちして作業するのは簡単です。コンテキストとシステムの両方を暗黙的に受け取り、利用可能な方に基づいて ActorRef を返す関数を作成できます。ただし、さらに重複を排除するために、問題が発生しました。

スコープ内 (コンテキストまたはシステム) に自動的にアクセスしたい場所は他にもたくさんあります。たとえば、system.config または context.system.config を呼び出したい場合、その状況に合わせてさらに別のラッパー関数を作成する必要があります。

私はこのようなことをしたいと思います:

appropriate.actorOf(Props[Whatever], name = "breakfast")

そして、適切な関数が利用可能な方 (アクターまたはシステム) を返すので、この 2 つの間の切り替えケースがあるすべての場所でこの関数を使用します。

私が遭遇した問題は、関数から [ActorContext, ActorSystem] を返すと、その型ではactorOfが利用できないというエラーが発生することです。したがって、どちらが返されてもどちらのタイプでも使用できるという事実ではなく、タイプに基づいてチェックしています。

私が試みていることを行う方法はありますか?

4

2 に答える 2

0

これを見つけた他の人にとって、これは私が最終的に得た解決策です:

def appropriateContext(implicit context: ActorContext = null, system: ActorSystem = null): ActorRefFactory = {
  val either: Either[ActorContext, ActorSystem] = if (context != null) Left(context) else Right(system)
  val refProvider = either.fold[ActorRefFactory](ac => ac, as => as)
  refProvider
}

そして、私は呼び出すことができます

appropriateContext.actorOf(Props[Whatever])

これには、追加するエラー処理がありません (両方が範囲内にあるか、どちらでもない場合の対処法) が、機能しています。

于 2013-11-07T17:42:36.890 に答える
0

サブタイプを使用してActorRefFactory、これを両方としてジェネリックにしActorContextActorSystemそれから継承する必要があります。どのタイプを返すかを判断する関数から返すか、Either言及したものを折りたたむことができます:

  val either:Either[ActorContext, ActorSystem] = ...

  val refProvider =  either.fold[ActorRefFactory](ac => ac, as => as)

  refProvider.actorOf(Props[Whatever], name = "breakfast")

アップデート

コメントであなたの質問に答えるには、まず、Eitherオブジェクトを作成しているので、そのコンテンツのメソッドが利用できるとは思わないでください。Either左または右のオブジェクトを保持し、それ自体が独自のメソッドを持つオブジェクトです。foldoverは 2 つのEither関数を受け取ります。1 つは左の型を取り、新しいデータ型を返し、もう 1 つの関数は右の型を取り、同じデータ型を返します。fold を使用することで、いずれかから値を取得できます。これがどのように機能するかをさらに詳しく知りたい場合は、 Scala での 関数型プログラミングを強くお勧めします。

さらに、コードを簡素化し、いずれかをすべて一緒に削除できます。これは、コンテキストでは本当に不要なためです。

  def appropriateContext(implicit context: ActorContext = null, system: ActorSystem = null): ActorRefFactory = {
    if (context != null) context else system
  }
于 2013-11-07T04:47:53.753 に答える