在Scala中,“滥用”不适用的模式匹配方法是好的吗?我想要做的是,将一个对象与另一个对象进行匹配,并构造另一个对象。由于我在Scala方面非常新,所以我最终得到了以下解决方案。但是,像这样使用不适用的方法似乎不太正确,因为它是作为一个提取器使用的。有人能给我关于这个的反馈吗?
object Poker {
def unapply(hand: Hand): Option[Poker] = if(hand.countValueGroups().exists(_._2 == 4)) Some(new Poker(hand)) else None
}
val h = Hand("AC As AH Ad 2h")
h match {
case Poker(han) => println("POKER!!!"+han)
case _ => println("?????")
}发布于 2015-10-02 17:14:05
我不知道为什么这应该是糟糕的练习,所以我会说答案是不,这是正常的做法。正如一位评论者所说,unapply的目的仅仅是用于模式匹配。虽然模式匹配主要用于case class的伴生对象,但这个概念是有意向其他提取器(例如:正则表达式)开放的。
在您的示例中,唯一奇怪的是返回带有Option[Poker]的Poker,开始一个单例对象。由于您不能在这方面做很多事情,所以您可能希望使用Boolean来代替:
object Poker {
def unapply(hand: Hand): Boolean =
hand.countValueGroups().exists(_._2 == 4)
}
case class Hand(s: String) {
def countValueGroups(): List[(Any, Int)] = List("foo" -> 4) // ???
}
val h = Hand("AC As AH Ad 2h")
h match {
case Poker() => println("POKER!!!")
case _ => println("?????")
}https://stackoverflow.com/questions/32910141
复制相似问题