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

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>
3个回答

8
据我所知,在ColdFusion中没有办法通过引用传递简单的值。我能想到的唯一解决方法就是你已经在使用的那个方法。
相反,我建议尝试重构你的程序以使其符合语言的特性。在只有一个简单值需要“修改”的情况下,你可以让函数返回新值,并像这样调用它:
<cfset SomeVar = TheFunctionName(SomeVar)>

在你需要修改多个值时,退一步并考虑是否可以将这些多个值捆绑到一个CFC中,你的mutator函数成为CFC方法。这可能是一种更清晰和可维护的解决方案。

1

您可以将函数内外使用的变量放在两个代码区域都存在的作用域中。例如,如果您将变量放在“session”或“request”作用域中,则可以从函数内部访问它。所做的更改将持久保存。

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

<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()函数来进行一些调试工作。


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所说的方法。

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