加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么这种模式匹配在Scala中没有像预期的那样工作?

发布时间:2020-12-16 18:04:37 所属栏目:安全 来源:网络整理
导读:我试图复制Joshua Suereth在2013年Devoxx的题为“如何在战壕中使用 Scala”的演讲中提出的强大模式匹配示例.不幸的是,我无法实现他所描述的,我无法理解什么是错的.有人能给我一些暗示我缺少的东西吗? (我的Scala版本是2.10.3) 请参阅下面的自包含代码: cas
我试图复制Joshua Suereth在2013年Devoxx的题为“如何在战壕中使用 Scala”的演讲中提出的强大模式匹配示例.不幸的是,我无法实现他所描述的,我无法理解什么是错的.有人能给我一些暗示我缺少的东西吗? (我的Scala版本是2.10.3)

请参阅下面的自包含代码:

case class Person(name: String,residence: Seq[Residence])
case class Residence(city: String,country: String)

object LivesIn {
  def unapply(p: Person): Option[Seq[String]] =
    Some(
      for(r <- p.residence)
      yield r.city
    )
}

class StringSeqContains(value: String) {
  def unapply(in: Seq[String]): Boolean =
    in contains value
}

object PatternPower extends App {

  val people =
    Seq(Person("Emre",Seq(Residence("Antwerp","BE"))),Person("Ergin",Seq(Residence("Istanbul","TR"))))

  val Istanbul = new StringSeqContains("Istanbul")

  // #1 does not work as expected,WHY?
  println(
    people collect {
      case person @ LivesIn(Istanbul) => person
    }
  )

  // #2 works as expected
  println(
    people collect {
      case person @ LivesIn(cities) if cities.contains("Istanbul") => person
    }
  )

  // #3 works as expected
  println(
    people collect {
      case person @ Person(_,res) if res.contains(Residence("Istanbul","TR")) => person
    }
  )

}

当我编译并运行它时,我得到:

List()
List(Person(Ergin,List(Residence(Istanbul,TR))))
List(Person(Ergin,TR))))

如源代码所示,我无法理解为什么第一个模式不会产生与其余两个模式匹配相同的结果.有什么想法吗?

解决方法

你的LivesIn提取器需要一个参数的Seq.

以下变体符合您的期望:

println(
  people collect {
    case person @ LivesIn(List("Istanbul")) => person
  }
)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读