作用域内变量的模式匹配(Scala)

6
在以下代码中:
val x = 5
val y = 4 match {
  case x => true
  case _ => false
}

变量y的值为true。Scala将x解释为模式匹配中的自由变量,而不是将其绑定到作用域中同名的变量。

如何解决这个问题?


3
你为什么要复制一个已经存在的问题并自己回答它? https://dev59.com/z1fUa4cB1Zd3GeqPKbXr https://dev59.com/7lTTa4cB1Zd3GeqPvcfu - dhg
@dhg:我在SO上找不到那个问题,所以我自己回答了我的问题,因为我更喜欢使用SO作为知识库,而不是在我的小博客上做笔记或进行心理帖子。谢谢你的链接,我同意将其关闭为重复。 - ron
2个回答

12

使用反引号绑定一个作用域变量:

val x = 5
val y = 4 match { case `x` => true; case _ => false }

返回false

或者,如果变量以大写字母开头,则绑定到一个作用域变量而无需使用反引号。


请参见http://scala-programming-language.1934581.n4.nabble.com/scala-pattern-matching-proposal-td1999364.html。 - ron

7

遵循“最少惊奇原则”,我将简单地执行以下操作:

val x = 5
val y = 4 match {
  case z if z == x => true
  case _ => false
}

Ron的回答是正确的,你添加了一个可以直接进行模式匹配的条件。(踩) - Nicolas
我认为这个条件非常快,记住最小惊讶原则。(点赞) - Anonymous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接