Scala 在match中将unapply用作构造函数

Scala 在match中将unapply用作构造函数,scala,Scala,在Scala中,“滥用”不适用的模式匹配方法是一种好的风格吗?我想做的是将一个对象与另一个对象进行匹配,然后构造另一个对象。因为我是Scala的新手,所以我最终得到了以下解决方案。但是,像这样使用unapply方法似乎并不正确,因为它是一个提取器。有人能给我一些反馈吗 object Poker { def unapply(hand: Hand): Option[Poker] = if(hand.countValueGroups().exists(_._2 == 4)) Some(new

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

我不知道为什么这应该是不好的做法,所以我会说答案是不,这是正常的做法。正如一位评论者所说,
unapply
的唯一目的就是用于模式匹配。虽然模式匹配主要用于
case类
的伴生对象,但该概念有意向其他提取器开放(例如:正则表达式)

在您的示例中,唯一奇怪的事情是使用
Poker
返回
Option[Poker]
,开始一个单例对象。由于您不能用它做很多工作,因此可能需要使用
布尔值

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

如果这是坏习惯,那么我就完蛋了;)虽然,在scala 2.11中,除了模式匹配之外,你还可以更高效地使用什么呢?感谢你的反馈,我将研究基于名称的提取器。我之所以问这个问题,是因为教程让它看起来像是extractor的主要目的是返回给定对象的状态。但是,Scala教程并不是我见过的最好的:实际上有一个伴奏类,我只是为了简洁而省略了它。您可以在此处查看完整代码: