2012-01-13 11 views
8

Spesso ho il desiderio di creare variabili con scope a un'istruzione if. Alcuni calcoli riguardano solo una particolare istruzione "se" - per inquinare l'ambito esterno con variabili temporanee maleodoranti.Variabili con ambito dell'istruzione if

Quello che vorrei fare:

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! 

Un'alternativa è piuttosto disordinato:

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 

L'ovvia alternativa che sto cercando di evitare:

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 

è qualcosa come questo possibile in Scala? C'è una soluzione decente? In caso contrario, quali altre lingue supportano un'idea del genere?

risposta

20

Dal if in Scala è un'espressione, cioè restituisce un valore, normalmente si imposterà un valore sul risultato dell'espressione if. Così la vostra terza alternativa è più che bene: metterlo in un blocco di codice, vale a dire

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 
} 

Nessuno dei val s dichiarati all'interno del blocco sono disponibili al di fuori di esso.

+0

Very cool! Grazie! – vertexshader

5

È possibile utilizzare un pattern match:

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 il risultato di x * y o x * 2, a seconda di quale calcolo corse, e x contiene il valore di data*2+5.4345/2.45, se lo desideri.

+0

+1 Bella idea ... – Landei

0

È possibile creare un ambito per esso ...

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

Oppure, per renderlo più chiaro,

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