2015-11-20 10 views
6

Per evitare le ifest annidate e migliorare la leggibilità, ho voluto creare una dichiarazione switch(true){ ... }switch(true){ ... } in Coldfusion. Ho usato questo spesso in php, ma quando provo questo nel Coldfusion, ottengo il seguente errore in fase di inizializzazione:switch (true) con casi dinamici in coldfusion?

errore Template

Questa espressione deve avere un valore costante.

Questo accade quando un caso switch utilizza una variabile nella sua condizione, come:

//this example throws the error 
switch(true){ 
    case foo == 1: 
     writeOutput('foo is 1'); 
    break; 
} 

Utilizzando un interruttore (true) {...} dichiarazione con valori costanti (come l'errore spiega) fa lavoro:

//this example doesn't throw the error 
switch(true){ 
    case 1 == 1: 
     writeOutput('1 is 1'); 
    break; 
} 

C'è un modo per far funzionare la prima istruzione in Coldfusion? Magari con una valutazione della variabile o qualche trucco, o è un deciso non andare in Coldfusion?

+0

No. A meno che non abbiano cambiato il comportamento in CF11, deve essere una costante o [scritta in modo tale che sia conforme alla regola costante] (http://stackoverflow.com/questions/31910902/coldfusion-cfscript-switch-case- dove-case-tra-a-gamma). – Leigh

risposta

2

In breve: no. Il valore del caso deve essere qualcosa che può essere compilato in un valore costante. 1==1 può essere, in quanto è solo true. foo == 1 non può essere, come foo è disponibile solo in fase di esecuzione.

in pratica quello che stai descrivendo è un if/else if/ costrutto comunque, quindi basta usare uno di quelli.

+0

scrivendolo con if/else se/else lo rende un po 'disordinato, perché implica un sacco di regole di business basate su determinati valori min e max, ma suppongo che questo sia l'unico modo allora – jan

+0

Potrebbe valere la pena guardare se c'è un modo diverso di affrontare il problema a pieno ritmo. Se hai più di 500 casi (come per il tuo commento sulla risposta di Miguel), allora il codice è un po 'puzzolente comunque. Questo è probabilmente qualcosa di cui sei già a conoscenza, e non sei nella posizione di occupartene ora, me ne rendo conto. Questa è solo un'osservazione, e non è destinata a essere snippy. –

+0

Avrei bisogno di più di 500 casi se utilizzo la soluzione della seconda risposta, dove quel valore di 'caso' è un singolo valore costante. In realtà non ho più di 500 casi individuali :-) – jan

2

Come hanno sottolineato Adam e Leigh, i valori del caso devono essere costanti. Non sono sicuro di quale sia il tuo caso d'uso effettivo ma puoi fare qualcosa del genere:

switch(foo){ 
    case 1: 
     writeOutput('foo is 1'); 
    break; 
    case 2: 
     writeOutput('foo is 2'); 
    break; 
    case 3: 
     writeOutput('foo is 3'); 
    break; 
    case 4: 
    case 5: 
    case 6: 
     writeOutput('foo is 4 or 5 or 6'); 
    break; 
    default: 
     writeOutput("I do not have a case to handle this value: #foo#"); 
} 
+0

Nel mio caso, questa non è un'opzione. Dovrei scrivere più di 500 casi – jan

Problemi correlati