你能否通过cfscript在函数中使用可选参数?

10

我最近开始使用cfscript编写代码,想先编写一些必要的格式化函数。以下是一个示例:

    Function FormatBoolean(MyBool, Format) { 

    Switch(Format){
        Case "YES/NO":{
            If (MyBool eq 1)
                Return "YES";
            Else
                Return "NO";
            Break;
        }

        Default:{
            If (MyBool eq 1)
                Return "Yes";
            Else
                Return "";
            Break;
        }
    }
}
我想做的是使Format成为一个可选参数。如果你不包括这个参数,函数仍将运行,但它将无法找到format,并且似乎cfparam未被转换为cfscript。
我是否只需要检查是否定义了Format并给它一个值?还是有更好的方法来实现这个目标?
谢谢。
2个回答

15

个人而言,我更喜欢将这种参数设置为默认值。此外,我稍微重构了函数...但没有测试过 :)

function FormatBoolean(required any MyBool, string Format = "") { 

    switch(arguments.Format) {
        case "YES/NO":
            return YesNoFormat(arguments.MyBool EQ 1);
        default:
            return (arguments.MyBool eq 1) ? "Yes" : "";
    }

}
请注意,(arguments.MyBool EQ 1) 可能会被替换为 (arguments.MyBool),以涵盖所有布尔值。如果你想要更可靠的结果,可以尝试使用以下代码 (isValid("boolean", arguments.MyBool) AND arguments.MyBool) -- 这应该能够检查任何值。

我删除了之前的评论,因为这是正确的(我之前看错了列)。谢谢你提供如此简单和干净的解决方案! - Limey
请记住,(arguments.MyBool)(arguments.MyBool eq 1)的结果略有不同。 - Leigh
@ Leigh,不是我在回答的第二部分说的一样吗? :) - Sergey Galashyn
@Sergii - 难怪你问有什么不同 :) 我以为我在早先的评论中添加了一个示例,像是 "(arguments.MyBool) 将把负数视为 true". 但我现在可以看到它不在那里 ;) 噢。 - Leigh
我创建了一个名为trycf gist的测试,它似乎在Lucee和ACF10中都能工作:https://trycf.com/gist/9f2a60d78a641d179726ab02e16864e6/lucee5?theme=monokai - Sander

1

传递到函数中的所有变量都可以通过ARGUMENTS作用域以编程方式访问。您可以将其视为数组(因为它就是一个数组),也可以使用标准结构键访问(我已经为您在下面的MyBool参数中完成了):

<cfscript>
    Function FormatBoolean(MyBool) { 

    var theFormat = '';

    if (ArrayLen(ARGUMENTS) GT 1)
        theFormat = ARGUMENTS[2];

    Switch(theFormat){
        Case "YES/NO":{
            If (ARGUMENTS.MyBool eq 1)
                Return "YES";
            Else
                Return "NO";
            Break;
        }

        Default:{
            If (ARGUMENTS.MyBool eq 1)
                Return "Yes";
            Else
                Return "";
            Break;
        }
    }
}
</cfscript>

根据需要添加您首选的额外数据验证级别。


我知道你在做什么,但这并不是最干净的方法,对吧?如果你需要4或5个输入,考虑尝试使用这种方法。所有函数定义只有一个变量,你需要查看函数代码才能确定实际需要传入什么。 - Limey
这是在cfscript块中的操作方式。如果您想要更清晰的方法,您需要返回到<cffunction>并按名称指定所有参数,并将'required'设置为false...但在访问数据之前,您仍然需要以编程方式检查它们的存在。 - Shawn Holmes
这也适用于CF 5版本之后的版本。Sergii的解决方案需要CF 8(我相信)。 - ale
感谢您的投票。我仍在考虑如何回应可选参数和带有默认值的命名参数之间的差异——这是两个不同的概念,并且在这个问题/答案中被混淆了……但我也不想混淆一个明显的解决方法。 - Shawn Holmes
我认为在cfscript中的可选参数直到cf 9才出现。 - enigment

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