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数据发生变化?
从技术上讲,当执行此操作时,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.name和y.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)