Функции также являются переменными, поэтому таким же образом вы можете использовать скобочные обозначения для массивов, структур и областей, вы можете использовать их для доступа к динамическим именам переменных (и, следовательно, к динамическим именам функций)
Например,:
<cfloop index="Field" list="email,uname,pass">
<cfset Result = Variables['validate_'&Field]( Variables['r_'&Field] ) />
...
</cfloop>
Ну ... не совсем.Из-за ошибки в Adobe 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]
, которая иногда бывает полезна.)