2012-01-13 12 views
8

Muchas veces deseo crear variables con ámbito en una instrucción if. Algunos cálculos solo se relacionan con una declaración particular 'si': contaminar el alcance externo con variables temporales huele mal.Variables con ámbito de declaración If

Lo que me gustaría hacer:

val data = (whatever) 

if (val x = data*2+5.4345/2.45; val y = data/128.4; x*y < 10) 
    x * y 
else 
    x * 2 

println(x) //ERROR! 

Una alternativa es bastante desordenado:

val data = (whatever) 

if (data*2+5.4345/2.45*data/128.4 < 10) 
    data*2+5.4345/2.45*data/128.4 
else 
    data*2+5.4345/2.45 * 2 

La alternativa obvia que estoy tratando de evitar:

val data = (whatever) 
val x = data*2+5.4345/2.45 
val y = data/128.4 

if (x*y < 10) 
    x*y 
else 
    x * 2 

println(x) //OK 

Es algo como esto posible en Scala? ¿Hay una solución decente? Si no, ¿qué otros idiomas admiten una idea como esta?

Respuesta

20

Dado que if en Scala es una expresión, es decir, devuelve un valor, normalmente estaría estableciendo algún valor para el resultado de su expresión if. Por lo que su tercera alternativa está bien: lo puso en un bloque de código, es decir

val data = (whatever) 
val myValue = { 
    val x = data*2+5.4345/2.45 
    val y = data/128.4 

    if (x*y < 10) 
    x*y 
    else 
    x * 2 
} 

Ninguno de los val s declaradas dentro del bloque están disponibles fuera de ella.

+0

muy fresco! ¡Gracias! – vertexshader

5

Se puede utilizar un ajuste de patrones:

val data = 123 

val (result, x) = (data*2+5.4345/2.45, data/128.4) match { 
    case (x, y) if x * y < 10 => (x * y, x) 
    case (x, _)    => (x * 2, x) 
} 

println(x) 

result contiene el resultado de x * y o x * 2, dependiendo de que se desarrolló el cálculo y la x contiene el valor de data*2+5.4345/2.45 lo deseas.

+0

+1 Buena idea ... – Landei

0

Puede crear un ámbito para que ...

{ 
    val x = data*2+5.4345/2.45 
    val y = data/128.4; 
    if (x*y < 10) 
    x * y 
    else 
    x * 2 
} 

O, para hacerlo más claro,

locally { 
    val x = data*2+5.4345/2.45 
    val y = data/128.4; 
    if (x*y < 10) 
    x * y 
    else 
    x * 2 
} 
Cuestiones relacionadas