LUA gsub 返回意外值

EMc*_*ary 2 lua gsub

我一直在努力学习LUA,但遇到了一个令人困惑的问题。当我尝试打印以下值时,它返回 5。这个 5 来自哪里?

print(tonumber(string.gsub("spawn10", "%D", ""))) -- 5
Run Code Online (Sandbox Code Playgroud)

如果我打印它而不将其转换为 int,我会得到更奇怪的响应。

print(string.gsub("spawn10", "%D", "")) -- 10   5
Run Code Online (Sandbox Code Playgroud)

也许我对 gsub 的理解不正确,但我不明白这些 5 来自哪里。

Nif*_*fim 5

您的调用基本上是获取字符串值10并将其转换为基数中的数字5,从而得到 number 5。发生这种情况是因为tonumber可以采用超过 1 个参数,可选的第二个参数base

\n

Lua 5.4参考手册 - tonumber(e[,base])

\n
\n

当使用基数调用时,e 必须是一个要被解释为该基数中的整数的字符串。基数可以是 2 到 36 之间的任何整数(包括 2 和 36)。

\n
\n

因此,您要做的就是tonumber通过传递所有结果(gsub包括第二个返回值)来进行调用,该返回值指示发生的匹配数。

\n

Lua 5.4参考手册 - string.gsub(s,pattern,repl[,n])

\n
\n

返回 s 的副本,其中所有(或前 n 个,如果给定)出现的模式(请参阅 \xc2\xa76.4.1)已被 repl 指定的替换字符串替换,该替换字符串可以是字符串、表、或一个函数。gsub 还返回发生的匹配总数作为其第二个值。gsub 这个名字来自 Global SUBstitution。

\n
\n
\n

有几种方法可以解决此问题,请在调用中指定tonubmer基数

\n
print(tonumber(string.gsub("spawn10", "%D", ""),10))\n
Run Code Online (Sandbox Code Playgroud)\n

或者正如您发现的gsub那样(

\n
print(tonumber((string.gsub("spawn10", "%D", ""))))\n
Run Code Online (Sandbox Code Playgroud)\n

这两个方法都通过丢弃除 gsub 返回的第一个值之外的所有值来完成相同的事情。

\n

Lua 5.4参考手册中描述了这种机制:3.4 \xe2\x80\x93 表达式

\n
\n

如果将函数调用用作语句(请参阅\xc2\xa73.3.6),则其返回列表将调整为零元素,从而丢弃所有返回值。如果表达式用作表达式列表的最后一个(或唯一的)元素,则不会进行任何调整(除非表达式包含在括号中)。在所有其他上下文中,Lua 将结果列表调整为一个元素,要么丢弃除第一个值之外的所有值,要么在没有值时添加一个 nil。

\n
\n