Coldfusion组件指针

dav*_*urg 1 coldfusion components pointers

我正在构建一个Coldfusion组件的问题.好吧,我不确定这是一个问题,或者事情是如何起作用的,但这看起来很奇怪.首先,我为我的组件的init函数设置参数并调用组件.但是如果我在调用后更改其中一个参数,它也会更改组件中保存的值.它是否正确?

我不确定我是否能很好地解释这一点.这是一些伪代码:

<cfset fruit = [] />
<cfset fruit[1] = {
    id = 1,
    name = "apple"
} />
<cfset fruit[2] = {
    id = 2,
    name = "orange"
} />

<cfset args = {
    title = "Fruit",
    data = fruit
} />

<cfinvoke component="test" method="init" returnvariable="test" argumentcollection=#args# />

<cfset fruit[2].name = "banana" />
Run Code Online (Sandbox Code Playgroud)

init函数将titledata参数存储在组件的variables范围中.

现在,如果我从test对象输出数据,我得到applebanana.但我期望该组件保留在调用期间收到的数据.

如果我需要澄清任何事情,请告诉我.谢谢你的帮助!

Lei*_*igh 5

我不确定这是一个问题,或者事情是如何起作用的,

是的,这就是您当前代码的工作方式.这是否是你想要它的行为是一个不同的问题..

大多数复杂对象(结构,组件,etectera)都通过引用传递.这意味着您实际上只是存储指向对象的指针,而不是实际值.因此,您将始终看到对基础对象所做的任何更改.这就是输出test变化的原因.

数组是一个例外.它们通常(但并不总是)按值传递.这意味着您有一个独立的副本,不会反映对原始对象所做的任何更改.

你的例子很有趣,因为它包含两者.嵌套结构(name=orange=> name=banana)的更改在组件中可见,因为结构是通过引用传递的.但是父数组不是.所以你可以清除fruit,它对组件没有任何影响.

例:

<cfset fruit[2].name = "bananna" />

<!--- both dumps will show "bananna" --->
<cfdump var="#fruit#" label="Fruit Before" />
<cfdump var="#test.getDataArray()#" label="Test.Data Before" />

<cfset arrayClear(fruit) />

<!--- fruit is empty and the component array is not --->
<cfdump var="#fruit#" label="Fruit After" /> 
<cfdump var="#test.getDataArray()#" label="Test.Data After" /> 
Run Code Online (Sandbox Code Playgroud)

测试:

<cfcomponent>

  <cffunction name="init" returntype="any" ...>
     <cfargument name="title" type="string" required="true" />
     <cfargument name="data" type="array" required="true" />
     <cfset variables.title = arguments.title />
     <cfset variables.data = arguments.data />
     <cfreturn this />   
  </cffunction>

  <cffunction name="getDataArray" returntype="array">
     <cfreturn variables.data />
  </cffunction>

</cfcomponent>
Run Code Online (Sandbox Code Playgroud)

现在,如果我从测试对象输出数据,我会得到苹果和香蕉.

对.这是可以预料到的,因为结构是通过引用传递的.如果您希望组件维护独立副本,则需要duplicate()(即深层复制)data内部元素init().

   <cfset variables.data = duplicate(arguments.data) />
Run Code Online (Sandbox Code Playgroud)