Scala 在match中将unapply用作构造函数
在Scala中,“滥用”不适用的模式匹配方法是一种好的风格吗?我想做的是将一个对象与另一个对象进行匹配,然后构造另一个对象。因为我是Scala的新手,所以我最终得到了以下解决方案。但是,像这样使用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
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教程并不是我见过的最好的:实际上有一个伴奏类,我只是为了简洁而省略了它。您可以在此处查看完整代码: