3

背景

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

我遇到的问题是,由于冷聚变没有 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如果and使用不同的参数名称,它也不起作用bar
  • 一系列 if StructKeyExists 语句仅传递可选参数(如果存在)。这会起作用,但很快就会变得非常复杂。
4

2 回答 2

2

你会想要默认它们

因此,在您的示例中,您可以告诉 CFoptional1等于""

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
  }
}
于 2015-02-04T13:49:47.330 回答
1

这是一个涉及 StructKeyExists 的解决方案,但可能与您已经考虑的方式不同:

bar(
  optional1 = StructKeyExists(arguments, 'optional1') ? arguments.optional1 : JavaCast('null', 0),
  optional2 = StructKeyExists(arguments, 'optional2') ? arguments.optional2 : JavaCast('null', 0)
);
于 2015-02-05T17:43:13.703 回答