2

後でその型の新しいインスタンスを起動するために使用できる、一連のクラス型を Scala に格納する有効で柔軟な方法を見つけようとしています。

class Event(

  val name: String,
  val channels: Seq[String],
  val processors: Seq[T] // a sequence of processor classes

)

上記のシーケンスの各プロセッサは Akka Actor クラスです。次のようにプロセッサをマッピングして、データを受信するたびに新しいアクターを作成する予定です。

event.processors.foreach { processorType =>
  val processor = newProcessor(processorType) // does all the Akka creation stuff
  processor ! Data
}

更新:Seq[T]どうやら上記はどちらかというと正しいので、プロセッサ タイプのみを強制するにはどうすればよいでしょうか? だから、次のようなクラスに固執するclass Calculator extends Processor

私の推測では、私が見逃した Scala の落とし穴がいくつかあると思います。ご協力ありがとうございます。

4

2 に答える 2

2

Seq[T]T型または型パラメーターのいずれかがある場合にのみ有効です。

scala> class Event(val seq:Seq[T])
<console>:7: error: not found: type T
       class Event(val seq:Seq[T])
                               ^

クラスのリストを取得するには、Seq[Class[_]] である必要があります。

あなたが言及したプロセッサがタイプであるとしましょうProcessor。より小さな実例:

scala>  trait Processor; class P1 extends Processor; class P2 extends Processor

scala> case class Event(val seq:Seq[Class[_ <: Processor]])
defined class Event

scala> Event(List(classOf[P1],classOf[P2]))
res4: Event = Event(List(class P1, class P2))

scala> res4.seq map { _.newInstance }
res6: Seq[Processor] = List(P1@43655bee, P2@337688d3)
于 2012-10-26T20:46:55.833 に答える
2

これは、そのPropsために作られています。使用する利点は、引数なしのコンストラクターの使用に制限されるのではなく、実行時にProps必要なパラメーターをProcessorコンストラクターに渡すことができることです。

注意すべきことの 1 つは、名前による引数Propsを取ることです。そのため、実際にはその時点で は作成されません。toを渡すと作成されます。creatorProps(new TestActor)TestActorPropsactorOf()

Actors を のサブタイプに制限するには、 のサブタイプProcessorを作成できますProps

例えば:

trait Processor extends Actor

class MyProps(creat: () ⇒ Processor) extends Props(creat)

object MyProps {
  def apply(creator: ⇒ Processor): MyProps = new MyProps(() => creator)
}

クラスEventにはSeq[MyProps]. サンプルテストは次のとおりです。

case class Event(      
  name: String,
  channels: Seq[String],
  processors: Seq[MyProps]       
)

class TestActor(bar: String) extends Processor {
  def receive = {
    case msg @ _ => println(bar + " " + msg)
  }
}

object SeqProps extends App {
  override def main(args: Array[String]) {
    val system = ActorSystem()

    val event = new Event("test", Seq("chan1", "chan2", "chan3"), 
      Seq(MyProps(new TestActor("baz")),
          MyProps(new TestActor("barz"))))

    event.processors.foreach { proc =>
      system.actorOf(proc) ! "go!"
    }

    system.shutdown()
  }
}

Processor非toを渡そうとMyProps()すると、コンパイル時に失敗します。

scala> class NotProcessor extends Actor {
     |   def receive = emptyBehavior
     | }
defined class NotProcessor

scala> MyProps(new NotProcessor)
<console>:15: error: type mismatch;
 found   : NotProcessor
 required: Processor
              MyProps(new NotProcessor)
                      ^
于 2012-10-27T00:37:00.323 に答える