2015-11-20 2 views
6

Чтобы избежать вложенных операторов if и улучшить читаемость, я хотел создать оператор switch(true){ ... } в Coldfusion. Я использовал это часто в PHP, но когда я пытаюсь это в Coldfusion, я получаю следующую ошибку при инициализации:переключатель (правда) с динамическими корпусами в coldfusion?

ошибка шаблона

Это выражение должно иметь постоянное значение.

Это происходит, когда переключатель случае использует переменную в своем состоянии, как:

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

Используя переключатель (истина) {...} оператор с постоянными значениями (как объясняет ошибка) делает работы:

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

Есть ли способ получить первое заявление для работы в Coldfusion? Может быть, с оценкой переменной или некоторой трюки, или это определенно не идет в Coldfusion?

+0

Nope. Если они не изменили поведение в CF11, оно должно быть константным или [написано таким образом, чтобы оно соответствовало правилу констант] (http://stackoverflow.com/questions/31910902/coldfusion-cfscript-switch-case- где-случай-между-а-диапазон). – Leigh

ответ

2

Вкратце: нет. Значение case должно быть чем-то, что может быть составлено до постоянного значения. 1==1 может быть, как это только true. foo == 1 не может быть, поскольку foo доступен только во время выполнения.

в основном то, что вы описываете, так или иначе, так что просто используйте один из них.

+0

записывая его с if/else if/else, что делает его немного грязным, потому что он включает в себя тонну бизнес-правил, основанных на определенных минимальных и максимальных значениях, но я думаю, что это единственный путь, то – jan

+0

Возможно, стоит посмотреть, есть ли другой способ приблизиться к проблеме полной остановки. Если у вас более 500 случаев (согласно вашему комментарию на ответ Мигеля), тогда код немного вонючий. Это, возможно, то, о чем вы уже знаете, и сейчас не в состоянии справиться, я это понимаю. Это всего лишь наблюдение, и оно не должно быть удручающим. –

+0

Мне понадобится более 500 случаев, если я использую это решение второго ответа, где это значение «случай» является единственным постоянным значением. У меня на самом деле нет более 500 отдельных случаев :-) – jan

2

Как указал Адам и Ли, значения случая должны быть постоянными. Я не уверен, каков ваш фактический вариант использования, но вы можете сделать что-то вроде этого:

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

В моем случае это не вариант. Мне пришлось бы писать более 500 случаев – jan