switch(true) 与 coldfusion 中的动态案例?

switch(true) with dynamic cases in coldfusion?

为了避免嵌套的 if 语句并提高可读性,我想创建一个 switch(true){ ... } Coldfusion 中的语句。我在 php 中经常使用这个,但是当我在 Coldfusion 中尝试这个时,我在初始化时遇到以下错误:

Template error

This expression must have a constant value.

当 switch case 在其条件中使用变量时会发生这种情况,例如:

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

使用具有常量值的 switch(true){ ... } 语句(正如错误所解释的那样)确实有效:

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

有没有办法让第一个语句在 Coldfusion 中工作?也许对变量或一些技巧进行评估,或者这在 Coldfusion 中绝对不行吗?

简而言之:没有。 case 值需要是可以编译 为常量值的东西。 1==1 可以,因为它只是 truefoo == 1 不可能,因为 foo 仅在运行时可用。

基本上你所描述的是一个 if / else if / else 构造,所以只使用其中之一。

正如 Adam 和 Leigh 所指出的,case 值需要保持不变。我不确定你的实际用例是什么,但你可以这样做:

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#");
}

作为对这个问题的更新,我会注意到 CF2020(目前处于 public 测试版)增加了对动态大小写值的支持。

是的,它是在理解某些语言出于性能原因不允许这样做的情况下完成的。出于 readability/flexibility 原因,他们选择像其他语言一样允许它,并让开发人员负责为他们的用例进行 cost/benefit 权衡分析。