Lua 的 rawlen 函数

Lua 的 rawlen 函数是一个内置函数,用于获取表或字符串的长度,而不触发任何元方法。这个函数在 Lua 5.2 及更高版本中可用。

函数语法

rawlen(v)

其中 v 可以是表(table)或字符串(string)。

功能说明

  1. 当参数是字符串时:

    • 返回字符串的字节长度(等同于 # 操作符的行为)
    • 示例:
      print(rawlen("hello"))  -- 输出 5
      
  2. 当参数是表时:

    • 返回表的"序列部分"的长度
    • 不会调用 __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(忽略元方法)
    

应用场景

  1. 需要精确获取表序列部分长度时
  2. 需要绕过可能存在的 __len 元方法时
  3. 性能敏感场景(rawlen# 操作符稍快)

注意事项

  1. 对于非序列表(有空洞的表),行为与 # 操作符一致
  2. 如果参数既不是表也不是字符串,会抛出错误
  3. 在 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值