首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在match中使用unapply作为构造函数

在match中使用unapply作为构造函数
EN

Stack Overflow用户
提问于 2015-10-02 15:00:59
回答 1查看 90关注 0票数 0

在Scala中,“滥用”不适用的模式匹配方法是好的吗?我想要做的是,将一个对象与另一个对象进行匹配,并构造另一个对象。由于我在Scala方面非常新,所以我最终得到了以下解决方案。但是,像这样使用不适用的方法似乎不太正确,因为它是作为一个提取器使用的。有人能给我关于这个的反馈吗?

代码语言:javascript
复制
 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("?????")
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-02 17:14:05

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

在您的示例中,唯一奇怪的是返回带有Option[Poker]Poker,开始一个单例对象。由于您不能在这方面做很多事情,所以您可能希望使用Boolean来代替:

代码语言:javascript
复制
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("?????")
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32910141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档