Можете ли вы сравнить типы таблиц или метатаблиц в Lua?

Я вызываю функцию API в функции сценариев Beta Lua Lord of the Rings Online (LOTRO). Метод 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

и вот результат:

player:GetClass():24
Turbine.Gameplay.Class.Captain:24
Вы играете капитаном


person John B    schedule 12.01.2011    source источник


Ответы (2)


Документация по API немного сбивает с толку, хотя я полагаю, что нашел то, что вы ищете. Следующий код должен сказать вам, является ли игрок капитаном:

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

Капитан является членом таблицы Gameplay.Class, которая представляет собой просто целое число, как следует из документации.

Примечание. Вам не нужно заканчивать предложение Lua знаком «;».

Не смог проверить. Надеюсь, что это работает.

person erpy    schedule 16.01.2011
comment
Я знаю, что мне не нужна точка с запятой, она мне просто нравится. Начал с PHP и перешел на C# :D - person John B; 17.01.2011

Если у вас есть список возможных метатаблиц для этих значений, вы можете получить их метатаблицы с помощью getmetatable(obj) и сравните их с теми, которые у вас уже есть. Не имея доступа к LOTRO API, я не могу больше сказать по теме: где это можно прочитать?

Это, конечно, предполагает, что таблица, возвращаемая функцией GetClassAttributes(), имеет собственную метатаблицу и что можно различать ее метатаблицу и таблицы атрибутов других классов.

person Alexandre Araujo Moreira    schedule 12.01.2011
comment
Вот версия документации по API: lotrointerface.com/wiki/LocalPlayer - person John B; 12.01.2011
comment
Так что я слышу, что это может быть невозможно? Меня как новичка в Lua это очень удивляет! - person John B; 12.01.2011
comment
У меня еще не было достаточно времени, чтобы прочитать это, но это может быть невозможно, потому что, если возвращаемые значения представляют собой простые таблицы со значениями, без наследования или чего-либо еще, у них может не быть причин иметь разные метатаблицы. Тип значения, которое у вас есть, - это таблица, и ничего, кроме таблицы, может не понадобиться. Некоторые люди согласовывают способы создания ООП в Lua, работая с метатаблицами таким образом, чтобы их можно было различать, но это не высеченное в камне правило. (Редактировать: когда я говорю ООП, я имею в виду ООП на основе классов) - person Alexandre Araujo Moreira; 13.01.2011
comment
Я только что проверил это, и, хотя в документе об этом не говорится, мне кажется, что у каждого объекта есть метатаблица, которая отличается в зависимости от типа. Вы должны быть в состоянии, имея под рукой эти таблицы на lotrointerface.com/wiki/ClassAttributes, сравните их с (возможно) метатаблицей по результату, который вы получите от вызова метода. Хотя отсутствие документации может намекать на то, что все, что вы пытаетесь сделать, может быть сделано другим способом. - person Alexandre Araujo Moreira; 13.01.2011
comment
Похоже, я должен иметь возможность получить ссылку на метатаблицу для данного типа, а затем сравнить ее с метатаблицей, возвращаемой функцией. Есть идеи, как я это сделаю? - person John B; 13.01.2011
comment
getmetatable(obj) дает вам метатаблицу для одного объекта, вы можете использовать это, чтобы получить метатаблицу для любого возвращаемого player:GetClassAttributes(). После этого вы сможете сравнить с теми таблицами, которые приведены в ссылке в моем предыдущем сообщении, на вики-странице ClassAttributes. Если вам повезет, вы сможете легко их сравнить. - person Alexandre Araujo Moreira; 13.01.2011
comment
Спасибо за помощь Александру! Решение - это ответ других парней, к вашему сведению. - person John B; 20.01.2011