我能否在lua中检查字符串的相等性?

40

这只是一个简单的初学者问题,我正在编写适用于Garrys Mod的Lua代码,并通过阅读维基和其他代码学习。

if (self.Owner:SteamID( ) == "STEAM_0:1:44037488" ) then

以上是我想使用的代码,用于检查STEAM ID(我认为是一个字符串)是否等于我的确切字符串。

这可行吗?还是我应该使用其他方法?


只是提醒一下,我不会建议使用Garry's Mod开始Lua编程。它使用可疑的编码风格(在if语句中使用括号),非标准化的语法(!||&&别名用于notorand),并且具有相当糟糕的API(随机替换内置函数,如requireloadstringFooEx函数等)。 - Colonel Thirty Two
Lua不是C语言,你不需要在括号中使用if条件语句,这是多余的。 - Alexander Altshuler
4个回答

50

这应该正如你所期望的那样工作。在lua中,对于字符串来说,'=='将在字符串内容相等时返回true。

正如评论中指出的那样,lua字符串是内部化的,这意味着具有相同值的任何两个字符串实际上是同一个字符串。


12
"==" 实际上是身份比较,而不是逐个字符比较(除非有意进行重载)。但是所有的 Lua 字符串都被存储在内部,因此相等的字符串始终是相同的,并且相等性测试的代价为零。" - user3125367
1
确实是一个非常好的发现 - 我不知道关于内部化部分的事情。谢谢。 - lisu
1
从Lua 5.2.1开始,字符串长度超过40个字符不再被内部化。在这种情况下,Lua仍然会做正确的事情,即逐个字符比较。我不知道Garry's Mod使用哪个Lua版本。 - siffiejoe

12

学习Lua时需要考虑一件事情(来自www.lua.org/source/5.2/lstring.h.html):

/*
** as all string are internalized, string equality becomes
** pointer equality
*/
#define eqstr(a,b)      ((a) == (b))

Lua中的字符串比较是廉价的,但创建字符串可能不是。


4
根据http://wiki.garrysmod.com/page/Player/SteamIDSteamID()返回一个字符串,因此您应该能够编写:
if self.Owner:SteamID() == "STEAM_0:1:44037488" then
    ...do stuff...
end

如果您需要确认对象的类型,请使用typeprint,例如在这种情况下print('type is', type(self.Owner:SteamID()))应该打印出'type is string'。

0
在lua中,如上所述,'=='用于检查相等性。不是说你这样做了,因为你没有,但一个常见的错误是认为'='是相等的。'='是赋值,'=='是相等的。

1
这不是对问题的答案。一旦您拥有足够的声望,您就可以评论任何帖子; 相反,提供不需要向问者澄清的答案。- 来自审核 - Lorraine R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接