Lua中如何不复制直接获取数组尾部元素?

2026-04-01 20:261阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计382个文字,预计阅读时间需要2分钟。

Lua中如何不复制直接获取数组尾部元素?

我正在使用Lua 5.2,并为了解决这个问题的需要,假设以下专业用途的数组操作函数:这是一个返回数组尾部的函数(即移除第一个元素):function tail(t) if t[1] then t[1]=nil end return t end

我正在使用Lua 5.2,并且为了这个问题,假设这些表专门用作数组.

这是一个返回数组尾部的函数(数组减去第一个元素):

function tail(t) if # t <= 1 then return nil end local newtable = {} for i, v in ipairs(t) do if i > 1 then table.insert(newtable, v) end end return newtable end

例如:

prompt> table.concat(tail({10, 23, 8}), “, “)

23, 8

但是,这是通过返回表的新副本来实现的.有没有办法避免创建新表?

我正在寻找相当于C的返回指向下一个元素(t)的指针.可能吗?

如前所述,这通常是不可能的.

但是,使用元表,您可以通过引用原始表来实现执行所需操作而无需复制所有数据的尾部函数.以下适用于Lua 5.2中的大多数操作,但不适用于table.concat:

Lua中如何不复制直接获取数组尾部元素?

function tail(t) return setmetatable({}, { __index = function(_, k) return t[k+1] end, __newindex = function(_, k, v) t[k+1] = v end, __len = function(_) return #t-1 end, __ipairs = function(_) return function(_, i) if i+1==#t then return nil end return i+1, t[i+2] end, t, 0 end, __pairs = function(t) return ipairs(t) end, }) end

本文共计382个文字,预计阅读时间需要2分钟。

Lua中如何不复制直接获取数组尾部元素?

我正在使用Lua 5.2,并为了解决这个问题的需要,假设以下专业用途的数组操作函数:这是一个返回数组尾部的函数(即移除第一个元素):function tail(t) if t[1] then t[1]=nil end return t end

我正在使用Lua 5.2,并且为了这个问题,假设这些表专门用作数组.

这是一个返回数组尾部的函数(数组减去第一个元素):

function tail(t) if # t <= 1 then return nil end local newtable = {} for i, v in ipairs(t) do if i > 1 then table.insert(newtable, v) end end return newtable end

例如:

prompt> table.concat(tail({10, 23, 8}), “, “)

23, 8

但是,这是通过返回表的新副本来实现的.有没有办法避免创建新表?

我正在寻找相当于C的返回指向下一个元素(t)的指针.可能吗?

如前所述,这通常是不可能的.

但是,使用元表,您可以通过引用原始表来实现执行所需操作而无需复制所有数据的尾部函数.以下适用于Lua 5.2中的大多数操作,但不适用于table.concat:

Lua中如何不复制直接获取数组尾部元素?

function tail(t) return setmetatable({}, { __index = function(_, k) return t[k+1] end, __newindex = function(_, k, v) t[k+1] = v end, __len = function(_) return #t-1 end, __ipairs = function(_) return function(_, i) if i+1==#t then return nil end return i+1, t[i+2] end, t, 0 end, __pairs = function(t) return ipairs(t) end, }) end