2015-12-07 3 views
0

может кто-нибудь объяснить поведение этого фрагмента:Option буквальных против переменной Option

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 

Почему есть разница, когда я изменить Вэла против строкового литерала?

+2

Вы затеняете переменную 'xx', ваши ели t 'Some (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") 
    } 
} 

редактировать: Это называется как Stable Identifier Pattern, определенный в §8.1.5 в спецификации языка Scala

+0

Это интересные интересные ...! – Jesper