gpt4 book ai didi

function - 如何在 ColdFusion 中调用变量名作为函数名的一部分?

转载 作者:行者123 更新时间:2023-12-04 10:43:15 25 4
gpt4 key购买 nike

我正在编写一个函数来循环访问注册页面上的一些信息。在循环中,我试图根据数组调用函数。我遇到的问题实际上是正确调用函数,因为我试图将变量合并为函数名称的一部分。

这是我的代码:

<cfscript>
fields = arraynew(1);
fields[1] = 'r_email';
fields[2] = 'r_uname';
fields[3] = 'r_pass';

for(i = 1; i lte arraylen(fields); i = i + 1)
{
func = fields[i].split('r_');
func = 'validate_#func[2]#(#fields[i]#)';
}
</cfscript>

所以,我有三个函数:validate_email、validate_uname、validate_pass。如果我输入 writeoutput(),并尝试输出函数的结果,它们将不起作用。

这是代码:
<cfscript>
fields = arraynew(1);
fields[1] = 'r_email';
fields[2] = 'r_uname';
fields[3] = 'r_pass';

for(i = 1; i lte arraylen(fields); i = i + 1)
{
func = fields[i].split('r_');
func = 'validate_#func[2]#(#fields[i]#)';
writeoutput('#func#');
}
</cfscript>

现在,我明白当你使用 writeoutput() 并且你正在调用一个函数时,你需要在两端都有哈希符号。所以,假设我是这样写的:
writeoutput('#validate_#func[2]#(#fields[i]#)#');

它不起作用,因为第二个哈希符号取消了函数调用。这是该函数最终的外观(电子邮件示例):
writeoutput('#validate_email('email@site.com')#');

如何用正确的变量名替换“email”(#validate_email...),并且该函数仍然有效?我希望我已经让这变得可以理解了!

最佳答案

函数也是变量,所以你可以用同样的方式为数组、结构和作用域使用括号表示法,你可以使用它来访问动态变量名(以及动态函数名)

例如:

<cfloop index="Field" list="email,uname,pass">
<cfset Result = Variables['validate_'&Field]( Variables['r_'&Field] ) />
...
</cfloop>

嗯……不完全是。由于 Adob​​e ColdFusion 中的一个错误,它不能像那样工作(尽管它在其他 CFML 引擎中可以,例如 Railo),您必须将其分成两行,如下所示:
<cfloop index="Field" list="email,uname,pass">
<cfset TmpFunc = Variables['validate_'&Field] />
<cfset Result = TmpFunc( Variables['r_'&Field] ) />
...
</cfloop>

(这假设函数和字段都在 variables 范围内,如果不是,则需要引用它们所在的范围。)

如果函数处于具有状态的对象中,则此方法确实存在问题,它会丢失对这些变量的引用。

在 CF10 上,有 invoke 功能。较早版本的 CF 需要使用 cfinvoke 标签。

(作为旁注,CF10 确实添加了使用括号表示法引用函数结果的逆向能力,即 doSomething()[key] 有时很有用。)

关于function - 如何在 ColdFusion 中调用变量名作为函数名的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7206828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com