3

默认情况下,ColdFusion 按值将简单类型(如数字、字符串和 GUID)传递给函数。我想通过引用传递一个简单的类型。

我目前正在将一个简单的值包装在一个结构中(它们通过引用传递)。这解决了我的问题,但它非常难看:

<!--- TheFunctionName---->
<cffunction name="TheFunctionName">
     <cfargument name="OutVariable" type="struct">
     <cfset OutVariable.ID = 5>
</cffunction>

<cfset OutVariable=StructNew()>
<cfset TheFunctionName(OutVariable)>

<!--- I want this to output 5--->
<cfoutput>#OutVariable.ID#</cfoutput>

我宁愿这样:

<!--- TheFunctionName---->
<cffunction name="TheFunctionName">
     <cfargument name="OutVariable" passbyref="true">
     <cfset OutVariable = 5>
</cffunction>

<cfset TheFunctionName(OutVariable)>

<!--- I want this to output 5--->
<cfoutput>#OutVariable#</cfoutput>
4

3 回答 3

8

AFAIK,在 ColdFusion 中无法通过引用传递简单的值。我能想到的唯一解决方法是您已经在使用的解决方法。

相反,我建议尝试重组你的程序以适应语言的本质。如果只有一个简单的值可以“修改”,你可以让你的函数返回新值,然后像这样调用它:

<cfset SomeVar = TheFunctionName(SomeVar)>

如果您要修改多个值,请退后一步考虑是否可以将这些多个值捆绑到 CFC 中,而您的 mutator 函数成为 CFC 的方法。无论如何,这可能是更清晰、更易于维护的解决方案。

于 2009-07-17T22:17:51.397 回答
1

如果你:

  1. 在 CFC 中声明函数
  2. 使用 <cfinvoke> 调用函数

您可以指定 <cfinvoke> 参数“returnvariable”,然后根据需要输出该变量。

<cfinvoke component="this" method="TheFunctionName" returnvariable="blah">
     <cfinvokeargument name="data" value="whatever" type="string">

     <cfreturn data>
</cfinvoke>

<cfdump var="#blah#">

如果您在 cfscript 中编写所有内容,那么我会使用 SurroundedByFish 所说的。

于 2009-07-18T02:41:19.917 回答
1

您可以将函数外部和内部使用的变量安排在两个代码区域中都存在的范围内。例如,如果您将变量放在“会话”或“请求”范围内,您将能够从函数内访问它。所做的更改将持续存在。

请注意,当您这样做时,您实际上并没有将变量“传递”给函数。该函数只是假设变量存在或创​​建它,具体取决于您如何编码。

<cffunction name="TheFunctionName">
     <cfset Request.StrVar = "inside function<br />" />
</cffunction>

<cfscript>
    Request.StrVar = "outside function<br />";
    WriteOutput(Request.StrVar);
    TheFunctionName();
    WriteOutput(Request.StrVar);
</cfscript>

关于 ColdFusion 范围

如果对调用页面在需要时提前声明变量有任何疑问,您将不得不使用<cfparam>标记或IsDefined()函数做一些工作。

于 2009-07-17T22:33:16.437 回答