我可以在ColdFusion中通过引用传递一个简单的值吗?

时间:2009-07-17 21:51:35

标签: coldfusion pass-by-reference

默认情况下,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>

3 个答案:

答案 0 :(得分:8)

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

相反,我建议尝试重新构建您的程序以使用该语言。如果只有一个简单值来“修改”,你可以让你的函数返回新值,并将其称为:

<cfset SomeVar = TheFunctionName(SomeVar)>

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

答案 1 :(得分: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>

About ColdFusion Scopes

如果对需要提前声明变量的调用页面有任何疑问,则必须使用<cfparam>标记或IsDefined()函数进行一些调整。

答案 2 :(得分:1)

如果你:

  1. 在CFC中声明函数
  2. 使用&lt; cfinvoke&gt;
  3. 调用该函数

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

    <cfinvoke component="this" method="TheFunctionName" returnvariable="blah">
         <cfinvokeargument name="data" value="whatever" type="string">
    
         <cfreturn data>
    </cfinvoke>
    
    <cfdump var="#blah#">
    

    如果你在cfscript中编写所有内容,那么我会选择SurroundedByFish所说的内容。