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

dut*_*lab 3 coldfusion struct cfml

我有以下代码。

<cfset x = StructNew()>
<cfset y = StructNew()>

<cfset y.name = "1">
<cfset y.id = "2">

<cfset structInsert(x,"item1",y)>

<cfdump var="#x#">
Run Code Online (Sandbox Code Playgroud)

这将输出以下内容,这是我期望的。

struct
item1 struct
      name  1
      id    2
Run Code Online (Sandbox Code Playgroud)

然后,我添加此代码以插入另一组数据。

<cfset y.name = "3">
<cfset y.id = "4">

<cfset structInsert(x,"item2",y)>

<cfdump var="#x#">
Run Code Online (Sandbox Code Playgroud)

这将输出以下内容。

struct
item1 struct
      name  3
      id    4
item2 struct
      name  3
      id    4
Run Code Online (Sandbox Code Playgroud)

为什么item1数据发生变化?

Age*_*eax 6

从技术上讲,当执行此操作时,structInsert不会覆盖值-可以-

 <cfset y.name = "3">
 <cfset y.id = "4">

 <!--- show values before structInsert --->
 <cfdump var="#x#">
Run Code Online (Sandbox Code Playgroud)

(是否注意到转储显示item1数据已经更改,甚至再次调用structureInsert 之前?)

原因是结构通过引用传递。意思x.item1是只有一个指针y结构,而不是一个独立的副本。因此,当代码更新的价值观y.namey.id,这些更改会自动反映在x.item1为好。

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

<cfset y = structNew()>
<cfset y.name = "3">
<cfset y.id = "4">
Run Code Online (Sandbox Code Playgroud)

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

 <cfset x.item1 = y> ... or
 <cfset x["item1"] = y>
Run Code Online (Sandbox Code Playgroud)

同样,您可以通过使用快捷语法{}来创建和/或填充结构,从而将代码减少很多。这是一行中的整个示例:

<cfset x = { "item1": {"name": "1", "id": "2"}
        , "item2": {"name": "3", "id": "4"}
       }>
Run Code Online (Sandbox Code Playgroud)

...或者如果您需要单独添加结构,请使用:

<cfset x = {}>
<cfset x["item1"] = {"name": "1", "id": "2"}>
<cfset x["item2"] = {"name": "3", "id": "4"}>
Run Code Online (Sandbox Code Playgroud)

  • 可以,但是..除非您真的需要在结构中复制所有键,否则创建一个新键会更简单。而且,比所有单独的cfset的IMO都更时尚,使用`{}`更短: (2认同)