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] の両方のメッセージを処理できるようにするには、メッセージをどのように設定すればよいですか?