gpt4 book ai didi

Scala:在模式匹配中混合特征和案例类

转载 作者:行者123 更新时间:2023-12-03 21:10:46 27 4
gpt4 key购买 nike

我想匹配一些案例类。如果我不认识它们,我想匹配类必须扩展的指定特征。这看起来像

trait Event  //root trait
trait Status extends Event //special trait
trait UIEvent extends Event //special trait

case class Results extends Event //concrete case class
case class Query extends Event //concrete case class

case class Running extends Status //concrete case class
case class Finished extends Status //concrete case class

case class Update extends UIEvent //concrete case class
我运行以下测试
  val events = List(Results, Query, Running, Finished, Update)
events foreach {
case Results => println("Got a Results")
case Running => println("Got a Running")
case s:Status => println("Got some StatusEvent")
case ui:UIEvent => println("Got some UIEvent")
case e: Event => println("Generic Event")
case x => println("Didn't matched at all " + x)
}
println("############################")
val STATUS = classOf[Status]
val EVENT = classOf[Event]
val UIEVENT = classOf[UIEvent]
val RESULTS = classOf[Results]
val eventsClass = events map (_.getClass)
eventsClass foreach {
case RESULTS => println("Got a Results")
case STATUS => println("Got some StatusEvent")
case UIEVENT => println("Got some UIEvent")
case EVENT => println("Generic Event")
case x => println("Didn't matched at all " + x)
}
这导致以下输出
Got a Results
Didn't match at all Query
Got a Running
Didn't match at all Finished
Didn't match at all Update
############################
Didn't match at all class de.mukis.scala.test.main.Results$
Didn't match at all class de.mukis.scala.test.main.Query$
Didn't match at all class de.mukis.scala.test.main.Running$
Didn't match at all class de.mukis.scala.test.main.Finished$
Didn't match at all class de.mukis.scala.test.main.Update$
为什么我不能对案例类和特征进行模式匹配,或者只能在类上进行模式匹配?

最佳答案

问题是您指的是案例类的伴随对象,而不是它们的特定实例。因此,REPL 应该已经为您提供了弃用警告。

解决办法是加几个括号:

sealed abstract trait Event
sealed abstract trait Status extends Event
sealed abstract trait UIEvent extends Event

case class Results() extends Event
case class Query() extends Event

case class Running() extends Status
case class Finished() extends Status

case class Update() extends UIEvent


val events = List(Results(), Query(), Running(), Finished(), Update())
events foreach {
case Results() => println("Got a Results")
case Running() => println("Got a Running")
case s:Status => println("Got some StatusEvent")
case ui:UIEvent => println("Got some UIEvent")
case e: Event => println("Generic Event")
case x => println("Didn't match at all " + x)
}

或者,正如迪迪德建议的那样,使用 case object
sealed abstract trait Event
sealed abstract trait Status extends Event
sealed abstract trait UIEvent extends Event

case object Results extends Event
case object Query extends Event

case object Running extends Status
case object Finished extends Status

case object Update extends UIEvent


val events = List(Results, Query, Running, Finished, Update)
events foreach {
case Results => println("Got a Results")
case Running => println("Got a Running")
case s:Status => println("Got some StatusEvent")
case ui:UIEvent => println("Got some UIEvent")
case e: Event => println("Generic Event")
case x => println("Didn't match at all " + x)
}

关于Scala:在模式匹配中混合特征和案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7596314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com