0

FSM でいくつかのイベントを書きましたが、パターン マッチングでは説明できないことがわかりました。以下は完全に合法であると考えました。つまり、このアクターに vector[A] または vector[B] のメッセージを送信できます。

when(State) {
    case Event(content: Vector[A], _) => {
      println("matched A")
      stay
   }
   case Event(content: Vector[B], _) => {
     println("matched B")
     stay
  }  
}

ただし、アクターに vector[B] メッセージを送信すると、

java.lang.ClassCastException: B cannot be cast to A

したがって、基本的には、次のイベントが一致する場合でも、最初のイベントに一致しようとします。

さらに単純なパターン マッチの例を作成しようとしました。

object Pattern extends App {
    val n = Vector(1,2,3)
    val s = Vector("S", "S", "S")
    n match{
       case e:Vector[String] => println("matched string")
       case v:Vector[Int] => println("matched int")
   }

}

これは実際には合法ではありません。

Error:(8, 12) pattern type is incompatible with expected type;
found   : Vector[String]
required: scala.collection.immutable.Vector[Int]
case e:Vector[String] => println("matched string")

ただし、次のキャストを行うと、コードを実行できます。

object Pattern extends App {
  val n = Vector(1,2,3).asInstanceOf[Vector[Any]]
  val s = Vector("S", "S", "S")
  n match{
    case e:Vector[String] => println(n(0).getClass)
    case v:Vector[Int] => println("matched int")
  }
}

私が奇妙に感じるのは、Any は String に一致する可能性があると言っているようですが、print は java.lang.Integer であるということです。したがって、Vector[Any] であると言う vector[Int] があると考える必要があります。Vector[Any] は Vector[String] である可能性があるため、そのパターンに一致し、実際には vector[ であるためです。 Int] Vector[Any] としてマスクし、印刷も問題ありません。

誰かがこれらのパターンマッチングの観察を説明できますか?

また、状態が Vector[A] と Vector[B] の両方のメッセージを処理できるようにするには、メッセージをどのように設定すればよいですか?

4

1 に答える 1