2015-11-20 46 views
6

为了避免嵌套if语句并提高可读性,我想在Coldfusion中创建一个 switch(true){ ... }语句。我在PHP中经常使用这个,但是当我尝试这个ColdFusion中,我得到以下错误在初始化:在coldfusion中切换(true)动态情况?

模板错误

这种表达必须有一个恒定值。

这种情况发生在开关的情况下在其条件使用一个变量,如:

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

使用switch(真){...}语句常数值(如错误解释)不工作:

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

有没有什么办法让Coldfusion的第一个声明工作?也许是对变量或一些技巧的评估,或者这在Coldfusion中是不可行的?

+0

不是。除非它们改变了CF11中的行为,否则它必须是一个常数或[写成符合常数规则的方式](http://stackoverflow.com/questions/31910902/coldfusion-cfscript-switch-case-其中的病例之间-A-范围)。 – Leigh

回答

2

总之:没有。案例值需要是可以将编译为的东西为一个常数值。 1==1可以,因为它只是truefoo == 1不可以,因为foo仅在运行时可用。

基本上你所描述的是一个if/else if/else结构无论如何,所以只需使用其中之一。

+0

用if/else编写if/else使其有点麻烦,因为它涉及大量基于某些最小值和最大值的业务规则,但我认为这是唯一的方法 – jan

+0

如果存在以不同的方式解决问题的全程。如果你有500多个案例(根据你对Miguel的回答的评论),那么代码有点臭。这很可能是你已经知道的事情,现在不能处理,我意识到这一点。这只是一个观察,并不意味着会陷入困境。 –

+0

如果我使用第二个答案的解决方案,那么'case'的值为单个常量值时,我需要500个以上的案例。我实际上没有500个以上的个案:-) – jan

2

正如Adam和Leigh所指出的那样,案例值需要是一定的。我不确定你的实际使用情况是什么,但你可以这样做:

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