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

scala – 在一个模式中多次使用相同的变量

发布时间:2020-12-16 19:11:49 所属栏目:安全 来源:网络整理
导读:我希望能够在一个模式中多次使用单个变量,这样只有在所有地方都存在相同的值时它才会匹配,例如 list match { case x :: x :: xs = // recurse} 它将匹配List(1,1,2)但不匹配List(1,2,1).但这不会编译错误:x已经定义为值x. 在研究这个问题时,我发现我还可以
我希望能够在一个模式中多次使用单个变量,这样只有在所有地方都存在相同的值时它才会匹配,例如

list match {
  case x :: x :: xs => // recurse
}

它将匹配List(1,1,2)但不匹配List(1,2,1).但这不会编译错误:x已经定义为值x.

在研究这个问题时,我发现我还可以在案例条款中加入一名警卫,所以我可以这样做

list match {
  case x1 :: x2 :: xs if x1==x2 => // recurse
}

它似乎以相同的方式工作(它确实,对吧?).这很好,但是如果我想在很多地方使用相同的值,那就不会那么干净了

list match {
  case x1::x2::x3::x4::xs if x1==x2 && x2==x3 && x3==x4 => // recurse
}

有没有更优雅的方式我能做到这一点?

一些注意事项:是的,我只是在学习scala,如果不清楚的话,我不确定这是我真正想做的事情,但我只是对可能的事情感兴趣.在这方面,我并不是真的在寻找一个完全不同的解决方案,比如takeWhile或filter或者其他东西,但更多的是对模式匹配特别感兴趣.

解决方法

Scala在匹配方面没有提供那么大的灵活性(这可能是一件好事,因为必须要注意由于无意的变量重用而产生的错误).

如果您有大量相同的项目,您可能需要考虑嵌套匹配(但请注意,您不会在内部匹配中失败,以便在以后的外部匹配中完成,因此您必须在本地处理所有内容):

list match {
  case x :: rest => rest match {
    case `x` :: `x` :: `x` :: xs => println("Four of the same")
    case _ => println("Well,nonempty at least")
  }
  case _ => println("Boring,there's nothing here!")
}

注意反引号意味着“我们已经得到了这个变量,请检查它,不要设置它!”.

或者,如果您具有重复使用的专用功能,则可以创建自定义匹配器:

object FourOf {
  def unapplySeq(xs: List[Int]): Option[(Int,List[Int])] = xs match {
    case x :: y :: z :: a :: rest if x==y && y==z && z==a => Some((x,rest))
    case _ => None
  }
}

然后在需要复杂模式时使用它:

list match {
  case FourOf(x,rest) => println("four of the same")
  case x :: more => println("Nonempty")
  case _ => println("Yawn")
}

这些都不像你显然希望的那样整洁和灵活,但是再一次,我不确定在匹配语句中分配和测试相同变量之间的翻转是编写清晰代码的好方法.

(编辑:李大同)

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

    推荐文章
      热点阅读