每日一练之 Lua 表

发布于:2025-06-20 ⋅ 阅读:(21) ⋅ 点赞:(0)

Lua 的 table 是什么数据结构?如何创建和访问?

数据结构:Lua的table是一种哈希表,使用键值对存储数据,支持动态扩容
创建方式:

local t1 = {}
local t2 = {10,20,30}
local t3 = {name="Alice",age=25}

访问方式:

print(t2[1])
print(t3.name)
print(t3["age"])

table的索引可以是什么类型?

键(key):可以是任意可哈希类型(如 number、string、boolean、table、function 等),但是 nil 不能作为键(因为 nil 表示“不存在”)
值(value):可以是任意类型,包括 nil

local t = {}
t[10] = "num"
t["key"] = 20
t[true] = {}
t[t] = function() end

如何遍历table? ipairs 和 pairs 的区别?

ipairs:用于遍历数组部分,遇到第一个 nil 时停止
pairs:遍历整个 table(包括数组和哈希部分),顺序不固定


-- ipairs 输出:10
local t = {10,nil,30,name="Alice"}
for i,v in ipairs(t) do
    print(i, v)
end

-- pairs 输出(顺序可能不同):
-- 1   10
-- 3   30
-- name Alice
for k,v in pairs(t) do
	print(k, v)
end

如何删除table中的元素?

local t = {10,20,30}
t[10] = nil    -- 删除索引 2 的元素(中间元素删除后,数组长度不变)

local t = {name="Alice",age=25}
t.name = nil
table.remove(t,2) --删除第2 个元素
table.remove(t) --默认删除最后一个元素


for k in pairs(t) do
	t[k] = nil
end

t = {}

table.sort()的注意事项?

  • 仅适用于数组部分
  • 必须提供比较函数(如果比提供,默认按升序比较)
  • 比较函数需满足严格弱序
local t = {3,1,4,2}
table.sort(t, function(a,b)
	return a>b
end)
print(table.unpack(t))

如何实现table的深拷贝?

浅拷贝仅复制引用,深拷贝需递归复制所有嵌套 table

function deepcopy(t)
	if type(t) ~= table then return t end
	local copy = {}
	for k, v in pairs(t) do
		copy[deepcopy(k)] = deepcopy(v)
	end
	return setmetatable(copy, getmetatable(t))
end

table的元表 metatable 友什么作用?

元表允许自定义 table 的行为(如运算符重载、属性访问等)常见元方法:

  • __index:访问不存在的键时触发
  • __newindex:修改不存在的键时触发
  • __add:定义 +运算法行为

table和数组的区别?

table:动态哈希表,键可以是任意类型(除了 nil),索引可离散
数组:特殊的 table,键为连续整数,通过#获取长度

如何高效的向 table 末尾添加元素?

table.insert(t, 4)
t[#t + 1] = 5

Lua table如何实现几何(Set)?

利用 table 的键唯一性,将元素作为键存储:

local set = {}

function set:add(value)
	self[value] = true
end

function set:remove(value)
	self[value] = nil
end

-- 检查元素是否存在
function set:contains(value)
  return self[value] ~= nil
end

-- 使用示例
local s = setmetatable({}, set)
s:add(10)
s:add(20)
print(s:contains(10))  -- 输出:true

坚持每日一题,Lua 功力必涨!🔥


网站公告

今日签到

点亮在社区的每一天
去签到