2011-07-19 10 views
5

En el siguiente códigopartido patrón para la variable de alcance (Scala)

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

el valor y es cierto. Scala interpreta x como una variable libre en la coincidencia de patrón en lugar de vincularla a la variable con el mismo nombre en el alcance.

¿Cómo solucionar este problema?

+3

¿Por qué duplicar una pregunta existente, y luego responde por sí mismo? 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-integral-value – dhg

+0

@dhg: No pude encontrar esa pregunta en SO, es por eso. Respondo mi propia pregunta ya que prefiero usar SO como repositorio de conocimiento en lugar de tomar una nota en mi pequeño blog oculto o hacer una publicación mental. Gracias por el enlace, estoy de acuerdo con cerrar con duplicado. – ron

Respuesta

7

Invocando el principio menos asombro, simplemente voy a hacer:

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

La respuesta de Ron es la buena, usted agrega una condición que se puede emparejar con el patrón directamente . (Votación abajo) – Nicolas

+0

Creo que la condición es igual de rápida, y recuerda el principio de asombro mínimo. (upvote) – Anonymous

+0

Tienes un punto con ese principio. – ron

12

Backticking la variable indica para unir una variable con ámbito:

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

vuelve false.

Alternativamente, si una variable comienza con una letra mayúscula, se une a una variable de ámbito sin rebobinar.

+0

vea también http://scala-programming-language.1934581.n4.nabble.com/scala-pattern-matching-proposal-td1999364.html – ron