Lua 的 rawlen 函数是一个内置函数,用于获取表或字符串的长度,而不触发任何元方法。这个函数在 Lua 5.2 及更高版本中可用。
函数语法
rawlen(v)
其中 v 可以是表(table)或字符串(string)。
功能说明
-
当参数是字符串时:
- 返回字符串的字节长度(等同于
#操作符的行为) - 示例:
print(rawlen("hello")) -- 输出 5
- 返回字符串的字节长度(等同于
-
当参数是表时:
- 返回表的"序列部分"的长度
- 不会调用
__len元方法 - 示例:
local t = {1, 2, 3, nil, 5} print(rawlen(t)) -- 输出 3,因为第4个元素是nil
与 # 操作符的区别
#操作符会调用__len元方法(如果存在)rawlen完全绕过元方法,直接获取原始长度- 示例对比:
local t = setmetatable({1, 2}, {__len = function() return 10 end}) print(#t) -- 输出 10(调用元方法) print(rawlen(t)) -- 输出 2(忽略元方法)
应用场景
- 需要精确获取表序列部分长度时
- 需要绕过可能存在的
__len元方法时 - 性能敏感场景(
rawlen比#操作符稍快)
注意事项
- 对于非序列表(有空洞的表),行为与
#操作符一致 - 如果参数既不是表也不是字符串,会抛出错误
- 在 Lua 5.1 中不可用
性能考虑
rawlen 是一个轻量级的函数调用,比编写等价的 Lua 代码要高效:
-- 等价的 Lua 实现(性能较差)
function my_rawlen(v)
if type(v) == "string" then
return #v
elseif type(v) == "table" then
local len = 0
while v[len+1] ~= nil do
len = len + 1
end
return len
else
error("bad argument #1 to 'rawlen' (table or string expected)")
end
end
2167

被折叠的 条评论
为什么被折叠?



