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

3

背景

我在尝试将可选参数传递给另一个函数时遇到了问题。被调用的函数也有可选参数,所以我试图让这种可选性一直传递下去。

我遇到的问题是,由于ColdFusion没有空(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语句,只有在存在可选参数时才传递。这个方法可以工作,但可能会变得非常复杂。
3个回答

2

您需要将它们设置为默认值。

所以在您的例子中,您可以告诉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
  }
}

假设我控制所有函数,这似乎是理想的(因为我正在查看的内容非常混乱,需要进行大量重构)。通常情况下,为可选参数设置默认值似乎是个好主意。如果有不需要修改 bar 的答案出现,我会再考虑接受它。 - Richard Tingle

1
这里有一个解决方案,它涉及到 StructKeyExists,但可能与您已经考虑过的方式不同:
bar(
  optional1 = StructKeyExists(arguments, 'optional1') ? arguments.optional1 : JavaCast('null', 0),
  optional2 = StructKeyExists(arguments, 'optional2') ? arguments.optional2 : JavaCast('null', 0)
);

有趣的是,这比我想象中使用StructKeyExists会引起的混乱要好得多。我曾经想过将structkeyexists用于bar之外(因此在foo中使用各种各样的bar)。 - Richard Tingle

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接