Coldfusion Structinsert 正在覆盖原始插入值
Coldfusion Structinsert is overwriting the orignal inserted values
我有以下代码。
<cfset x = StructNew()>
<cfset y = StructNew()>
<cfset y.name = "1">
<cfset y.id = "2">
<cfset structInsert(x,"item1",y)>
<cfdump var="#x#">
这将输出以下内容,这是我所期望的。
struct
item1 struct
name 1
id 2
然后我添加这段代码来插入另一组数据。
<cfset y.name = "3">
<cfset y.id = "4">
<cfset structInsert(x,"item2",y)>
<cfdump var="#x#">
这将输出以下内容。
struct
item1 struct
name 3
id 4
item2 struct
name 3
id 4
为什么item1数据变了?
从技术上讲,structInsert 不会覆盖值 - 你是 - 当你这样做时:
<cfset y.name = "3">
<cfset y.id = "4">
<!--- show values before structInsert --->
<cfdump var="#x#">
(注意转储显示 item1
数据已经更改,甚至 在 再次调用 structureInsert 之前?)
原因是结构被传递by reference。意思是 x.item1
只是指向 y
结构的 指针 ,而不是一个独立的副本。因此,当代码更新 y.name
和 y.id
的值时,这些更改也会自动反映在 x.item1
中。
如果你想让y
结构完全独立,要么先创建一个new结构(或者用duplicate()深拷贝) .
<cfset y = structNew()>
<cfset y.name = "3">
<cfset y.id = "4">
话虽如此,除非有使用 structInsert() 的特定原因,否则现在使用结构或点表示法更为标准:
<cfset x.item1 = y> ... or
<cfset x["item1"] = y>
此外,您可以通过使用快捷语法 {}
来创建 and/or 填充结构,从而大大减少代码。这是一行中的整个示例:
<cfset x = { "item1": {"name": "1", "id": "2"}
, "item2": {"name": "3", "id": "4"}
}>
... 或者如果您需要单独附加结构,请使用:
<cfset x = {}>
<cfset x["item1"] = {"name": "1", "id": "2"}>
<cfset x["item2"] = {"name": "3", "id": "4"}>
我有以下代码。
<cfset x = StructNew()>
<cfset y = StructNew()>
<cfset y.name = "1">
<cfset y.id = "2">
<cfset structInsert(x,"item1",y)>
<cfdump var="#x#">
这将输出以下内容,这是我所期望的。
struct
item1 struct
name 1
id 2
然后我添加这段代码来插入另一组数据。
<cfset y.name = "3">
<cfset y.id = "4">
<cfset structInsert(x,"item2",y)>
<cfdump var="#x#">
这将输出以下内容。
struct
item1 struct
name 3
id 4
item2 struct
name 3
id 4
为什么item1数据变了?
从技术上讲,structInsert 不会覆盖值 - 你是 - 当你这样做时:
<cfset y.name = "3">
<cfset y.id = "4">
<!--- show values before structInsert --->
<cfdump var="#x#">
(注意转储显示 item1
数据已经更改,甚至 在 再次调用 structureInsert 之前?)
原因是结构被传递by reference。意思是 x.item1
只是指向 y
结构的 指针 ,而不是一个独立的副本。因此,当代码更新 y.name
和 y.id
的值时,这些更改也会自动反映在 x.item1
中。
如果你想让y
结构完全独立,要么先创建一个new结构(或者用duplicate()深拷贝) .
<cfset y = structNew()>
<cfset y.name = "3">
<cfset y.id = "4">
话虽如此,除非有使用 structInsert() 的特定原因,否则现在使用结构或点表示法更为标准:
<cfset x.item1 = y> ... or
<cfset x["item1"] = y>
此外,您可以通过使用快捷语法 {}
来创建 and/or 填充结构,从而大大减少代码。这是一行中的整个示例:
<cfset x = { "item1": {"name": "1", "id": "2"}
, "item2": {"name": "3", "id": "4"}
}>
... 或者如果您需要单独附加结构,请使用:
<cfset x = {}>
<cfset x["item1"] = {"name": "1", "id": "2"}>
<cfset x["item2"] = {"name": "3", "id": "4"}>