将可选参数传递给函数(其中它们也是可选的)



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 真正需要哪些参数(我尝试像这样调试代码,这并不好玩)。如果foobar使用不同的参数名称,它也不起作用
  • 一系列 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

最新更新