计算字符串长度会导致混淆

以下输出令我感到困惑:

local a = "string"
print(a.len)        -- function: 0xc8a8f0
print(a.len(a))     -- 6
print(len(a))
--[[
/home/pi/test/wxlua/wxLua/ ZeroBraneStudio/bin/linux/armhf/lua: /home/pi/Desktop/untitled.lua:4: attempt to call global 'len' (a nil value)
stack traceback:
    /home/pi/Desktop/untitled.lua:4: in main chunk
    [C]: ?
]]

Lua 中计算字符串长度的正确方法是什么?

提前感谢您的回答。

原文链接 https://stackoverflow.com/questions/69834138

点赞
stackoverflow用户10953006
stackoverflow用户10953006

你可以使用:

a = "string"
string.len(a)

或者:

a = "string"
a:len()

或者:

a = "string"
#a

编辑:你的原始代码不太符合惯用语法,但是也能正常工作

> a = "string"
> a.len
function: 0000000065ba16e0
> a.len(a)
6

字符串 a 与包含所有方法(包括 len)的表(称为元表)相关联。

一个方法只是一个函数,以字符串作为第一个参数。

function a.len (string) .... end

您可以像调用普通函数一样调用此函数,例如 a.len("test")Lua 有一种特殊的语法使其更容易编写。 您可以使用此特殊语法并编写 a:len(),它将等同于 a.len(a)

2021-11-04 05:03:58
stackoverflow用户2858170
stackoverflow用户2858170

这将打印 a.len 的字符串表示,a.len 是一个函数值。所有的字符串都共享一个通用的元表。

来自 Lua 5.4 参考手册:6.4 字符串操作

字符串库将它的所有函数提供在 string 表内。它还为字符串设置了一个元表,其中的 __index 字段指向字符串表。因此,你可以使用面向对象的方式来使用字符串函数。例如,string.byte(s,i) 可以写成 s:byte(i)

所以,因为 a 是一个字符串值,a.len 实际上指的是 string.len

出于同样的原因,

print(a.len(a))

等价于 print(string.len(a)) 或者 print(a:len())。这次你用参数 a 调用了函数,而不是打印它的字符串表示,所以你打印了它的返回值,即字符串 a 的长度。

另一方面,print(len(a)) 触发了一个错误,因为你试图调用一个全局 nil 值。在你的脚本中 len 不存在。它从来没有被定义过,因此是 nil。调用 nil 值没有意义,因此 Lua 抛出一个错误。

根据 Lua 5.4 参考手册:3.4.7 长度运算符

字符串的长度是它的字节数。(当每个字符是一个字节时,那是字符串长度的通常含义。)

你也可以调用 print(#a) 来打印 a 的长度。

长度运算符在 Lua 5.1 中被引入。

2021-11-04 08:11:40