Background
当我尝试将可选参数传递给另一个函数时,我遇到了问题。被调用的函数也有可选参数,所以我试图让该可选性一直传播。
我遇到的问题是,由于冷聚变没有null的概念(或者至少不是真的),当一个可选参数被省略时,它实际上不存在。
component accessors=true output=false persistent=false {
public void function foo(String otherOptional, String optional1,String optional2 ){
//Other code
//Other code
//Other code
bar(optional1=optional1,optional2=optional2);
}
public void function bar(String optional1, String optional2 ){
//Other code
}
}
例如,在上面的代码中,如果在没有任何参数的情况下调用foo
,我会收到一个错误
Variable OPTIONAL1 is undefined.
The error occurred in D:/web/experimental/OptionalTest.cfc: line 11
9 :
10 : //Other code
11 : bar(optional1=optional1,optional2=optional2);
12 :
13 : }
问题
有没有办法将可选参数传递给另一个函数,其中它们也是可选的而不会引起错误?
我考虑过的解决方案是:
- 通过
argumentcollection=arguments
.但这似乎非常令人不快,因为它使得很难阅读 bar 真正需要哪些参数(我尝试像这样调试代码,这并不好玩)。如果foo
和bar
使用不同的参数名称,它也不起作用 - 一系列 if StructKeyExists 语句,用于仅传递可选参数(如果存在)。这将起作用,但可能会很快变得非常复杂。
您需要默认使用它们
所以在你的例子中,你可以告诉CF optional1
等于""
:
component accessors=true output=false persistent=false {
public void function foo(String otherOptional="", String optional1="",String optional2="" ){
//Other code
//Other code
//Other code
bar(optional1=optional1,optional2=optional2);
}
public void function bar(String optional1, String optional2 ){
//Other code
if(len(optional1)){
//do this
}
//etc
}
}
这是一个涉及 StructKeyExists 的解决方案,但可能与您已经考虑的方式不同:
bar(
optional1 = StructKeyExists(arguments, 'optional1') ? arguments.optional1 : JavaCast('null', 0),
optional2 = StructKeyExists(arguments, 'optional2') ? arguments.optional2 : JavaCast('null', 0)
);
这个问题很老,但最正确的答案不在这里,这太疯狂了。是的,您可以在 arugments 作用域上使用 structKeyExists,但您也可以只使用 isDefined('argumentname'),这是自 CF3 以来的一个选项。
从文档中:计算字符串值以确定其中命名的变量是否存在。此函数是 ParameterExists 函数的替代函数,该函数已弃用。
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-in-k/isdefined.html