【问题标题】:Can I check strings equality in lua?我可以在lua中检查字符串是否相等吗?
【发布时间】:2015-02-22 08:39:56
【问题描述】:

只是一个直截了当的初学者问题,我正在为 Garrys Mod 编写 Lua 代码,通过阅读 wiki 和其他代码来学习。

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

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

这可行吗?或者我应该有其他方法吗?

【问题讨论】:

  • 请注意,我不会开始使用 Garry 的 Mod 进行 Lua 编程。它使用有问题的编码风格(if 语句中的括号)、非标准化语法(!||&& 别名为 notorand),并且有一个非常糟糕的 API (随机替换 requireloadstringFooEx 等内置函数)。
  • Lua 不是 C,你不需要括号中的 if 条件。这是多余的。

标签: string lua comparison equals


【解决方案1】:

这应该完全按照您的预期工作。在 lua 中,如果字符串的内容相等,则字符串的 '==' 将返回 true。

正如cmets中指出的,lua字符串是interned,这意味着任何两个具有相同值的字符串实际上都是同一个字符串。

【讨论】:

  • '==' 实际上是身份比较,而不是逐字符比较(除非故意重载)。但是所有的 Lua 字符串都是 intern 的,所以相等的字符串总是相同的,相等测试没有任何成本。
  • 这确实是一个很好的收获——我不知道实习的部分。谢谢。
  • @user3125367:从 Lua 5.2.1 开始,这不再是真的,因为长度超过 40 个字符的字符串不再被保留。在这种情况下,Lua 仍然做正确的事,即逐个字符的比较。我不知道 Garry's Mod 使用的是哪个 Lua 版本。
【解决方案2】:

学习 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 中的字符串比较很便宜,但创建字符串可能不是。

【讨论】:

    【解决方案3】:

    根据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'。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      猜你喜欢
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 2019-07-24
      • 2012-12-31
      • 2015-10-30
      相关资源
      最近更新 更多