【问题标题】:Can you compare the "types" of tables or metatables in Lua?你能比较 Lua 中表或元表的“类型”吗?
【发布时间】:2014-02-28 07:00:59
【问题描述】:

我正在调用指环王在线 (LOTRO) Beta Lua 脚本功能中的 API 函数。 API 方法返回一个名为 ClassAttributes 的“类型”,它将属于给定的类属性“类型”。我说“类型”是因为当我在返回值上调用 type() 时,它说它是一个表。

有没有办法让我检查类型或元表类型?例如:

local returnedTable = player:GetClassAttributes();

if (returnedTable.Name == "CaptainClassAttributes")
    print("You are playing a captain");
end

更新 以下代码是我使用的:

player = Turbine.Gameplay.LocalPlayer.GetInstance();

Turbine.Shell.WriteLine("player:GetClass():" .. player:GetClass());
Turbine.Shell.WriteLine("Turbine.Gameplay.Class.Captain:" .. Turbine.Gameplay.Class.Captain);

if (player:GetClass() == Turbine.Gameplay.Class.Captain) then
    Turbine.Shell.WriteLine("You are playing a captain");
end

这是输出:

玩家:GetClass():24
Turbine.Gameplay.Class.Captain:24
你在扮演队长

【问题讨论】:

    标签: types lua lua-table metatable


    【解决方案1】:

    API 文档有点混乱,但我想我找到了您要找的东西。 下面的代码应该告诉你玩家是否是队长:

    local player = Turbine.Gameplay.Player
    if (player:GetClass() == Turbine.Gameplay.Class.Captain) then
        print("You are playing a captain")
    end
    

    Captain 是 Gameplay.Class 表的成员,从文档中读取它只是一个整数。

    注意:Lua 语句不需要以“;”结尾。

    无法测试。希望它有效。

    【讨论】:

    • 我知道我不需要分号,我只是喜欢它。从 PHP 开始并移至 C# :D
    【解决方案2】:

    如果您有这些值的可能元表列表,您可以使用getmetatable(obj) function 获取它们的元表,并将它们与您已有的元表进行比较。由于无法访问 LOTRO API,我无法就该主题发表更多信息:我在哪里可以阅读它?

    当然,这是假设 GetClassAttributes() 函数返回的表具有自身的元表,并且可以区分它的元表和其他类的属性表。

    【讨论】:

    • 这里是 API 文档的一个版本:lotrointerface.com/wiki/LocalPlayer
    • 所以我听到的是这可能是不可能的?作为 Lua 的新手,这让我感到非常惊讶!
    • 我还没有足够的时间阅读它,但它可能是不可能的,因为如果返回的值是带有值的简单表,没有继承或任何东西,可能没有它们的理由有不同的元表。您拥有的值的类型是一个表格,可能只需要一个表格。有些人通过处理元表以区分它们的方式来约定在 Lua 中构建 OOP 的方法,但这并不是一成不变的规则。 (编辑:当我说 OOP 时,我指的是基于类的 OOP)
    • 我只是检查了一下,虽然文档没有说,但在我看来,每个对象都有一个根据类型不同的元表。您应该能够将lotrointerface.com/wiki/ClassAttributes 中的这些表放在手边,将它们与(可能)与调用该方法获得的结果的元表进行比较。尽管缺乏文档可能暗示这一点,但无论您尝试做什么,都可能以其他方式完成。
    • 所以听起来我应该能够获得对给定“类型”的元表的引用,然后将其与从函数返回的元表进行比较。知道我会怎么做吗?
    猜你喜欢
    • 2012-03-11
    • 2021-05-26
    • 1970-01-01
    • 2018-03-26
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多