【问题标题】:Coldfusion Structinsert is overwriting the orignal inserted valuesColdfusion Struct Insert 正在覆盖原始插入的值
【发布时间】:2019-07-28 14:54:46
【问题描述】:

我有以下代码。

<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 的数据发生了变化?

【问题讨论】:

    标签: struct coldfusion cfml


    【解决方案1】:

    从技术上讲,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 的值时,这些更改也会自动反映在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"}>
    

    【讨论】:

    • 谢谢Ageax。我会考虑到这一切。我现在用的是 Duplicate。
    • 这行得通,但是.. 除非你真的需要复制结构中的所有键,否则创建一个新键会更简单。此外,{} 比所有单独的 cfset 的 IMO 更时尚、更短:-)
    • 按引用传递与按值传递总是如此有趣的讨论。 :-)
    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 2021-06-10
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多