Pointers Coldfusion组件指针

Pointers Coldfusion组件指针,pointers,coldfusion,components,Pointers,Coldfusion,Components,我正在构建的Coldfusion组件有问题。嗯,我不确定这是否是个问题,也不确定事情应该如何运作,但这似乎很奇怪。首先,我为我的组件的init函数设置参数并调用该组件。但如果在调用后更改其中一个参数,它也会更改组件中保存的值。这是正确的吗 我不确定我是否解释得很好。下面是一些伪代码: <cfset fruit = [] /> <cfset fruit[1] = { id = 1, name = "apple" } /> <cfset fruit[2]

我正在构建的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" />

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>