首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将可选参数传递给函数(其中它们也是可选的)

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

Stack Overflow用户
提问于 2015-02-04 13:17:58
回答 3查看 255关注 0票数 3

背景

当我试图将可选参数传递给另一个函数时,我遇到了一个问题。被调用的函数也有可选的参数,所以我试着获得这个选项,以便一直传播下去。

我正在经历的问题是,由于冷融合没有空(或者至少不是真的)的概念,当一个可选的参数被省略时,它实际上并不存在。

代码语言:javascript
运行
复制
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,我会收到一个错误

代码语言:javascript
运行
复制
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语句,仅在存在可选参数时才传递它。这是可行的,但很快就会变得非常复杂。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-05 17:43:13

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

代码语言:javascript
运行
复制
bar(
  optional1 = StructKeyExists(arguments, 'optional1') ? arguments.optional1 : JavaCast('null', 0),
  optional2 = StructKeyExists(arguments, 'optional2') ? arguments.optional2 : JavaCast('null', 0)
);
票数 1
EN

Stack Overflow用户

发布于 2015-02-04 13:49:47

你会想把它们拖欠出去

所以在你的例子中,你可以告诉CF optional1等于""

代码语言:javascript
运行
复制
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
  }
}
票数 2
EN

Stack Overflow用户

发布于 2022-09-30 14:02:08

这个问题很古老,但最正确的答案不在这里,这是很疯狂的。是的,您可以在集合范围上使用structKeyExists,但也可以只使用isDefined('argumentname'),这是自CF3以来一直使用的选项。

从docs:计算字符串值,以确定其中命名的变量是否存在。这个函数是对ParameterExists函数的替代,后者被废弃。

https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-in-k/isdefined.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28322426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档