Pointers Coldfusion组件指针
我正在构建的Coldfusion组件有问题。嗯,我不确定这是否是个问题,也不确定事情应该如何运作,但这似乎很奇怪。首先,我为我的组件的init函数设置参数并调用该组件。但如果在调用后更改其中一个参数,它也会更改组件中保存的值。这是正确的吗 我不确定我是否解释得很好。下面是一些伪代码:Pointers Coldfusion组件指针,pointers,coldfusion,components,Pointers,Coldfusion,Components,我正在构建的Coldfusion组件有问题。嗯,我不确定这是否是个问题,也不确定事情应该如何运作,但这似乎很奇怪。首先,我为我的组件的init函数设置参数并调用该组件。但如果在调用后更改其中一个参数,它也会更改组件中保存的值。这是正确的吗 我不确定我是否解释得很好。下面是一些伪代码: <cfset fruit = [] /> <cfset fruit[1] = { id = 1, name = "apple" } /> <cfset fruit[2]
<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" />
init
函数将标题
和数据
参数存储在组件的变量
范围中
现在,如果我从test
对象输出数据,我会得到apple
和banana
。但我希望组件保留在调用过程中收到的数据
如果我需要澄清什么,请告诉我。谢谢你的帮助 当数组在ColdFusion中按值传递时,即使数组中的对象也是如此。如果要保留函数中的值,请返回init函数更新的数组,并将fruit数组设置为该数组 我有一个getter函数返回您的数组:
<cffunction name="getArray" returntype="array" access="public" output="false" hint="return the array" >
<cfreturn variables.theArray>
</cffunction>
在cfm模板中,将水果数组设置为该值:
<cfset fruit = test.getArray()>
当数组在ColdFusion中按值传递时,即使数组中的对象也是如此。如果要保留函数中的值,请返回init函数更新的数组,并将fruit数组设置为该数组 我有一个getter函数返回您的数组:
<cffunction name="getArray" returntype="array" access="public" output="false" hint="return the array" >
<cfreturn variables.theArray>
</cffunction>
在cfm模板中,将水果数组设置为该值:
<cfset fruit = test.getArray()>
我不确定这是不是一个问题,也不确定事情应该如何进行
是的,这就是当前代码的工作方式。你是否希望它这样做是另一个问题
大多数复杂对象(结构、组件、元素)都是通过引用传递的。这意味着您实际上只是存储指向对象的指针,而不是实际值。因此,您将始终看到对基础对象所做的任何更改。这就是test
的输出发生变化的原因
数组是个例外。它们通常(尽管不总是)按值传递。这意味着您有一个独立的副本,它不会反映对原始对象所做的任何更改
您的示例很有趣,因为它包含了这两个方面。对嵌套结构的更改(name=orange
=>name=banana
)在组件中可见,因为这些结构是通过引用传递的。但父数组不是。因此,您可以清除水果
,这对组件没有影响
示例:
<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" />
<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>
我不确定这是不是一个问题,也不确定事情应该如何进行
是的,这就是当前代码的工作方式。你是否希望它这样做是另一个问题
大多数复杂对象(结构、组件、元素)都是通过引用传递的。这意味着您实际上只是存储指向对象的指针,而不是实际值。因此,您将始终看到对基础对象所做的任何更改。这就是test
的输出发生变化的原因
数组是个例外。它们通常(尽管不总是)按值传递。这意味着您有一个独立的副本,它不会反映对原始对象所做的任何更改
您的示例很有趣,因为它包含了这两个方面。对嵌套结构的更改(name=orange
=>name=banana
)在组件中可见,因为这些结构是通过引用传递的。但父数组不是。因此,您可以清除水果
,这对组件没有影响
示例:
<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" />
<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>