1

私はプレイで遊んでいます!フレームワークと、新しいアクターを作成する Services というファクトリを作成したいと考えていました。私はこれまでのところこれを持っています

class UserRegistration extends Actor {
  def receive = {
    case "foo" => "bar"
  }
}

object UserRegistration {
  val path: String = "user/registration"
}


object Services {
  val system = ActorSystem("Services")

  def apply[A<:Actor]: ActorRef = system.actorOf(Props[A], A.path)
}

そして、次のようなメッセージを作成してアクターに渡したいと思いました。

Services[UserRegistration] ? "hello"

しかし、タイプのエラーが発生しcould not find implicit value for evidence parameter of type ClassManifest[A]ます。ここで何が間違っているのか教えてください。そして、これが一般的に有効な構造である場合 (ベスト プラクティス)。私は Scala の初心者で、まだ何かを学んでいます。

ありがとう!

4

2 に答える 2

1

セニアの答えも機能しますが、各タイプのアクターに共通のパスを指定する場合は、2 番目の暗黙のパラメーターが必要です (最初のパラメーターは、ClassManifest各タイプのアクターのパスを指定できるようにするためです。アクター名に注意してください。ただし、一意である必要があるため、そのパスに何かを追加する必要があります。

まず、パスを保持するクラスを定義します。

case class Path(value:String)

次に、アクター クラスのコンパニオン オブジェクトで暗黙的な値を定義します。

object SomeActor {
  implicit val path = Path("SomeActor")
}

最後に、apply メソッドを変更して、暗黙的なクラス マニフェストと暗黙的なパスを取得します。

def apply[A<:Actor](implicit cm:ClassManifest[A], path:Path[A]): ActorRef = 
  system.actorOf(Props[A], path.value + someIndex)
于 2012-12-28T12:07:59.613 に答える
1

applyobject のメソッドはProps、 type のパラメーターを暗黙的に受け取りますClassManifest[T]

apply [T <: Actor] (implicit arg0: ClassManifest[T])

そのようなパラメーターをメソッドに追加する必要があります。

def apply[A<:Actor : ClassManifest]: ActorRef = system.actorOf(Props[A])
于 2012-12-28T12:01:04.197 に答える