在匹配

时间:2015-10-02 15:00:59

标签: scala

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("?????")
 }

1 个答案:

答案 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("?????")
}