【问题标题】:Lua get value of a table in n tablesLua获取n个表中一个表的值
【发布时间】:2017-09-10 17:35:56
【问题描述】:

我有一个问题, 我必须更改之前位于n 表中的已知表中的值。 像这样的:

Box = {
        {Name = "",Box = {{Name = "",Box = {{Name = "", Box = {{Name = "This must be change for the test",Box = {}}}}}}}}
    }

要改变这一点,我可以使用以下代码对其进行硬编码:

Box[1].Box[1].Box[1].Box[1].Name = "Changed"

但这不是我想要的方式! 我想动态更改它,这样我就有一个函数可以更改主表'n' 中表'x' 的值'tbl'

有什么办法吗?

【问题讨论】:

  • local t, n = _G, 4; for j = 1, n do t = t.Box[1] end; t.Name = "Changed"
  • @EgorSkriptunoff,这应该足够回答了;我测量了;)
  • @PaulKulchenko - 但它非常适合单行评论! :-)
  • @EgorSkriptunoff 这是一个很好的答案!谢谢你。但是如果一个盒子有两张相同的桌子呢?有没有其他方法可以设置这个。喜欢Box[1].Box[5].Box[2].Box[3].Name = "Changed"
  • @YoungFlyme - 你知道1, 5, 2, 3的顺序吗?

标签: lua lua-table


【解决方案1】:

遇到这样的问题,您可能应该重新考虑您的设计选择。您描述的 n 个表中的那个表类似于树形图,其中字段 box 包含对子节点的引用。

根据您的 cmets 状态,您需要修改位于该树中动态路径上的节点。一个简单的功能是显而易见的:

local function follow_path(start_node, path,i)
  --takes start node and array of indices to follow
  --returns table that is stored in the box-tree at this path
  --i is for internal recursion
  i=i or 1
  if not path[i] then 
    return start_node
  else
    local new_start=start[path[i]]
    assert(new_start,"No node is on this path")
    return follow_path(new_start,path,i+1)
  end
end
local function follow_path_and_rename(start_node,path,field_name,new_value)
  local box = follow_path( start_node,path)
  box[field_name] = new_value
end

但是,根据您为什么需要使用动态路径修改节点,可能会有更可靠的方法。永远不会伤害的一件事是在创建过程中给每个盒子一个唯一的标识符:

local new_box
do
 local box_count=0
 new_box = function(name)
  box_count=box_count+1
  local box = { 
   unique_id=box_count,
   name=name,
   box={}
  }
  return box
 end
end

例如,您可以创建索引表,您的盒子始终可以通过它们的 id 访问:

local index={}
local add_new_box = function(name)
  local box = new_box(name)
  index[ box.unique_id] = box
  return box
end

或者,如果这是不可接受的,您可以随时在树的节点中搜索保证具有唯一值的节点。

但问题是:所有表都已经有了唯一标识符。这是他们的地址,当您执行a = {} 时分配给a 的值。这与unique_id 之间的唯一区别是: 1)a 不太可读。 2)如果你知道a,就不用找了。

所以,看看你的问题,看看并问自己: “这个需求从何而来?为什么我不能得到unique_id 而不是一系列索引?为什么我不能得到box 本身而不是unique_id?”

【讨论】:

    猜你喜欢
    • 2023-02-17
    • 2019-08-01
    • 2013-12-28
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2023-03-12
    相关资源
    最近更新 更多