我一直在努力学习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 来自哪里。
您的调用基本上是获取字符串值10并将其转换为基数中的数字5,从而得到 number 5。发生这种情况是因为tonumber可以采用超过 1 个参数,可选的第二个参数base
Lua 5.4参考手册 - tonumber(e[,base])
\n\n\n当使用基数调用时,e 必须是一个要被解释为该基数中的整数的字符串。基数可以是 2 到 36 之间的任何整数(包括 2 和 36)。
\n
因此,您要做的就是tonumber通过传递所有结果(gsub包括第二个返回值)来进行调用,该返回值指示发生的匹配数。
Lua 5.4参考手册 - string.gsub(s,pattern,repl[,n])
\n\n\n返回 s 的副本,其中所有(或前 n 个,如果给定)出现的模式(请参阅 \xc2\xa76.4.1)已被 repl 指定的替换字符串替换,该替换字符串可以是字符串、表、或一个函数。gsub 还返回发生的匹配总数作为其第二个值。gsub 这个名字来自 Global SUBstitution。
\n
有几种方法可以解决此问题,请在调用中指定tonubmer基数
print(tonumber(string.gsub("spawn10", "%D", ""),10))\nRun Code Online (Sandbox Code Playgroud)\n或者正如您发现的gsub那样(
print(tonumber((string.gsub("spawn10", "%D", ""))))\nRun Code Online (Sandbox Code Playgroud)\n这两个方法都通过丢弃除 gsub 返回的第一个值之外的所有值来完成相同的事情。
\nLua 5.4参考手册中描述了这种机制:3.4 \xe2\x80\x93 表达式
\n\n\n如果将函数调用用作语句(请参阅\xc2\xa73.3.6),则其返回列表将调整为零元素,从而丢弃所有返回值。如果表达式用作表达式列表的最后一个(或唯一的)元素,则不会进行任何调整(除非表达式包含在括号中)。在所有其他上下文中,Lua 将结果列表调整为一个元素,要么丢弃除第一个值之外的所有值,要么在没有值时添加一个 nil。
\n