【问题标题】:Using unapply as constructor in match在匹配中使用 unapply 作为构造函数
【发布时间】:2015-10-02 15:00:59
【问题描述】:

在 Scala 中“滥用”模式匹配的 unapply 方法是一种好的风格吗?我想做的是将一个对象与另一个对象进行匹配,然后构造另一个对象。由于我是 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("?????")
 }

【问题讨论】:

  • 如果这是不好的做法,那我就完蛋了 ;) 虽然在 scala 2.11 中使用name based extractor 可以提高效率
  • unapply 除了模式匹配还有什么用处?
  • 感谢您的反馈,我会研究基于名称的提取器。
  • 我问的原因是因为教程让extracors的主要目的看起来像是返回给定对象的状态。但话说回来,Scala 教程并不是我见过的最好的:P

标签: scala


【解决方案1】:

我不知道为什么这应该是不好的做法,所以我会说答案是,这是正常的做法。正如一位评论者所说,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("?????")
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 2013-10-31
相关资源
最近更新 更多