如何模仿 Lua 的 table.pack() 不使用 `n` 键

我正在尝试重写自己的tablePack()函数,该函数返回一个没有 n 的表。

例如,调用tablePack (1,2,3)应返回表{1,2,3}

如何创建tablePack()函数?任何建议将不胜感激。


添加:

以下是一个示例代码:

local a = table.pack(1,2,3)
local b = {1,2,3}

print(a.n,b.n)

结果:

3   nil

如何创建自己的tablePack()函数,以便结果可以如下所示?

nil  nil

添加2:

这是解决方案吗?

function tablePack(...)
  local r = table.pack(...)
  r.n = nil
  return r;
end

也许这更好?

function ofTable(...)
  返回{...}
end
点赞
用户10850112
用户10850112

请忽略我之前的回答。

你将 n 设为 nil 的示例是完全可接受的并且可以正常运行。

(错误的代码,请忽略:)

你可以直接返回省略号:

function tablePack(...)
    return ...;
end

还有这个函数:

function tablePack(...)
   local n = select("#", ...);
   local t = debug.getinfo(0);
   for k in pairs(t) do
      t[k] = nil;
   end
   for i = 1, n do
      local e = select(i, ...);
      table.insert(t, e);
   end
   return t;
end

local t = tablePack(1,2,3);

print("length: " .. #t);

for e in pairs(t) do
   print(e);
end
2019-08-11 05:44:35
用户3574628
用户3574628

你的 ofTable 解决方案是最好的。

当某些参数可能是 nil 时,table.pack 很有用。 n 字段会让你检测 ... 中包含的尾随 nil,或应对 #ipairs 和大多数 table 函数不起作用的事实。

2019-08-11 16:34:16
用户19548099
用户19548099

```lua -- 定义一个局部函数unpack,如果函数unpack不存在,则将table.unpack赋值给unpack local unpack = unpack or table.unpack

-- 定义一个函数SafePack,用于将参数封装到一个table中,记录参数的个数 function SafePack(...) local params = {...} params.n = select('#', ...) return params end

-- 定义一个函数SafeUnpack,用于将一个安全的参数table展开 function SafeUnpack(safe_pack_tb) return unpack(safe_pack_tb, 1, safe_pack_tb.n) end

-- 定义一个函数ConcatSafePack,用于将两个安全的参数table拼接成一个 function ConcatSafePack(safe_pack_l, safe_pack_r) local concat = {} for i = 1,safe_pack_l.n do concat[i] = safe_pack_l[i] end for i = 1,safe_pack_r.n do concat[safe_pack_l.n + i] = safe_pack_r[i] end concat.n = safe_pack_l.n + safe_pack_r.n return concat end

-- 使用SafePack和SafeUnpack来替换它们

2022-07-14 09:18:33