gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:20:07 25 4
gpt4 key购买 nike

我希望能够在一个模式中多次使用一个变量,以便仅在所有位置都存在相同值的情况下,它才会匹配,例如

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

会匹配 List(1,1,2)但不匹配 List(1,2,1)。但这不能使用 error: x is already defined as value x进行编译。

在研究这个问题时,我发现我还可以在case子句中包含一个 guard ,因此我可以
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,所以我不确定这是我真正想要做的事情,但是我只是对可能的事情感兴趣。在这方面,我并不是真正在寻找一种完全不同的解决方案,例如 takeWhilefilter之类的东西,但更特别地是对模式匹配感兴趣。

最佳答案

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")
}

这些都不是您显然希望的那么整洁和灵活,但是,再次重申,我不确定在match语句中分配和测试相同变量之间的切换是否是编写清晰代码的好方法。

关于scala - 在一个模式中多次使用相同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13963507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com