Scala中的“滥用”模式匹配的不适用方法是不是很好?我想做的是将对象与另一个对象匹配,并构建另一个对象。由于我在Scala中相当新,我最终得到了以下解决方案。但是使用这样的unapply方法似乎并不正确,因为它是用作提取器的。有人可以就此给我反馈吗?
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("?????")
}
答案 0 :(得分:2)
我不知道为什么这应该是不好的做法,所以我会说答案是 no ,这是正常做法。正如一位评论者所说,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("?????")
}