2015-12-07 22 views
0

任何人都可以解釋這個片段的行爲:選項文字與期權可變

def test = { 
    val xt: Option[String] = Some("1") 
    val xx: String = "2" 
    xt match { 
    case Some(xx) => println("match") 
    case _ => println("no match") 
    } 
    xt match { 
    case Some("2") => println("match") 
    case _ => println("no match") 
    } 
} 

結果是

match 
noMatch 

爲什麼會出現差異,當我改變了對VAL字符串文字?

+2

您正在映射變量'xx',您的冷杉t'一些(xx)'不會被轉換爲'Some(「2」)',而是轉換成「Some(someVariable)'。 –

回答

6

表達case Some(xx)不匹配對的xx的值,它是在範圍,而是匹配任何並結合該結果到名爲xx新變量,遮蔽外部定義。

如果你要匹配現有的變量,無論是使用反引號:

def test = { 
    val xt: Option[String] = Some("1") 
    val xx: String = "2" 
    xt match { 
    case Some(`xx`) => println("match") 
    case _ => println("no match") 
    } 
    xt match { 
    case Some("2") => println("match") 
    case _ => println("no match") 
    } 
} 

或重命名變量以大寫字母:

def test = { 
    val xt: Option[String] = Some("1") 
    val Xx: String = "2" 
    xt match { 
    case Some(Xx) => println("match") 
    case _ => println("no match") 
    } 
    xt match { 
    case Some("2") => println("match") 
    case _ => println("no match") 
    } 
} 

編輯:這被稱爲到在斯卡拉語言規範的§8.1.5中定義的Stable Identifier Pattern

+0

那些是一些有趣的怪物...! – Jesper