gpt4 book ai didi

struct - Coldfusion Structinsert 正在覆盖原始插入的值

转载 作者:行者123 更新时间:2023-12-02 05:59:18 26 4
gpt4 key购买 nike

我有以下代码。

<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.namey.id 的值时,这些更改也会自动反射(reflect)在 x.item1 中。

如果您希望 y 结构完全独立,请先创建一个结构(或使用 duplicate() 进行深层复制)。

<cfset y = structNew()>
<cfset y.name = "3">
<cfset y.id = "4">

话虽如此,除非有特定原因使用 structInsert(),否则现在使用结构或点表示法更为标准:

 <cfset x.item1 = y> ... or
<cfset x["item1"] = y>

此外,您还可以通过使用快捷语法 {} 创建和/或填充结构来减少大量代码。这是一行中的整个示例:

<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"}>

关于struct - Coldfusion Structinsert 正在覆盖原始插入的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57242029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com