2011-07-19 64 views
5

在下面的代碼在範圍(Scala的)可變模式匹配

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

y是真實的。 Scala將x解釋爲模式匹配中的自由變量,而不是將其綁定到範圍中具有相同名稱的變量。

如何解決這個問題?

+3

爲什麼可以複製現有的問題,然後自己回答這個問題? http://stackoverflow.com/questions/6172557/problem-with-scala-matching-scope http://stackoverflow.com/questions/5153590/why-does-scala-complain-when-given-this- pattern-match-on-an-value- – dhg

+0

@dhg:我在SO上找不到這個問題,這就是爲什麼。我回答我自己的問題,因爲我更喜歡使用SO作爲知識庫,而不是在我的小型隱藏博客上留言或發表心理帖子。感謝您的鏈接,我同意以重複結束。 – ron

回答

7

調用最小驚訝原則,我會簡單地做:

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

羅恩答案是好的,你添加一個條件,可以直接模式匹配。 (downvote) – Nicolas

+0

我認爲條件是一樣快,並記住最少的驚訝原則。 (upvote) – Anonymous

+0

你有這個原則的一個觀點。 – ron

12

Backticking該變量指示一個範圍的變量綁定:

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

返回false

或者,如果一個變量以大寫字母開頭,它將綁定到範圍變量而不反錯。

+0

另請參閱http://scala-programming-language.1934581.n4.nabble.com/scala-pattern-matching-proposal-td1999364.html – ron