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
可以,因为它只是 true
。 foo == 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 权衡分析。
为了避免嵌套的 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
可以,因为它只是 true
。 foo == 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 权衡分析。