代码之家  ›  专栏  ›  技术社区  ›  user1511417

Lua 5.3.5意外表.insert行为

  •  1
  • user1511417  · 技术社区  · 6 年前

    使用时 table.insert(...) 这样地:

    test ={}
    table.insert(test, 1)
    print(test[1]) -- 1
    
    table.insert(test, 2)
    print(test[1]) -- 1
    

    预期的打印结果是

    1

    1

    local A = { b = {} }
    local B = { c = { x=0 } }
    
    function add(t, X)
      local temp = B
      temp.c = {x=X}
      table.insert(t.b, temp)
    end
    
    local a = A
    add(a, 1)
    print(a.b[1].c.x) -- 1
    
    add(a, 2)
    print(a.b[1].c.x) -- 2
    

    结果是

    2

    但不是也应该是1和1吗?这是我预期的行为,因为我正在访问 内部的 桌子 b 两次都是。我错过了什么?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Paul Kulchenko    6 年前

    local temp = B 任务,这使得 B 用于每个插入的元素)。

    添加 print(a.b[1] == a.b[2]) 到你的剧本结尾确认。

        2
  •  0
  •   user1511417    6 年前

    deep copy -复制表中所有内容的机制。这里的代码在提供请求的 A B

    function init_A(B)
        local t = {}
        if not (B== nil) then
            t.b = B
        else
            t.b = {}
        end
        return t
    end
    
    function init_B(C)
        local t = {}
        if not (C== nil) then
            t.c = C
        else
            t.c = { x=0 }
        end
        return t
    end
    
    function add(t, X)
      local temp = init_B({x=X})
      table.insert(t.b, temp)
    end
    
    local a = init_A()
    add(a, 1)
    print(a.b[1].c.x) -- 1
    
    add(a, 2)
    print(a.b[1].c.x) -- 1
    print(a.b[2].c.x) -- 2