Я пытаюсь найти что-то аналогичное классу в lua. В python я бы сделал:

a = {}
type(a)
>>>> dict

У меня есть словарь объектов в lua. Когда я печатаю объект, я получаю:

print(vocab)
>>> {
3 : 20
o : 72
m : 70
d : 61
( : 9
}

как заставить lua выдать объект, что-то аналогичное type() в python? - что даст вам класс объекта

Ответы (2)

В Lua существует 8 типов: nil, boolean, number, string, function, thread, table и userdata. Вы можете узнать, к какому из этих основных типов принадлежит ваш объект, используя встроенную функцию type():

type('Hello world')                    == 'string'
type(3.14)                             == 'number'
type(true)                             == 'boolean'
type(nil)                              == 'nil'
type(print)                            == 'function'
type(coroutine.create(function() end)) == 'thread'
type({})                               == 'table'
type(torch.Tensor())                   == 'userdata'

Обратите внимание, что тип torch.Tensor - userdata. Это имеет смысл, поскольку библиотека torch написана на языке C.

Тип userdata предоставляется для того, чтобы произвольные данные на языке C могли храниться в переменных Lua. Значение userdata - это указатель на блок необработанной памяти. Userdata не имеет предопределенных операций в Lua, кроме присваивания и проверки идентичности.

Метатаблица для userdata помещается в реестр, а поле __index указывает на таблицу методов, так что синтаксис object:method() синтаксис будет работать.

Так, имея дело с объектом userdata, мы не знаем, что он собой представляет, но имеем список его методов и можем их вызывать.

Было бы здорово, если бы у пользовательских объектов был какой-то механизм (метод или что-то в этом роде) для просмотра их пользовательских типов. И знаете что? У объектов Torch есть такой механизм:

t = torch.Tensor()
type(t)       == 'userdata' # Because the class was written in C
torch.type(t) == 'torch.DoubleTensor'
# or
t:type()      == 'torch.DoubleTensor'

Кстати, о Torch. У него есть свой эмулятор объектной системы, и вы можете сами создать несколько классов torch и проверить их типы тем же способом. Однако для Lua такие классы/объекты являются не более чем обычными таблицами.

local A = torch.class('ClassA')
function A:__init(val)
    self.val = val
end

local B, parent = torch.class('ClassB', 'ClassA')
function B:__init(val)
    parent.__init(self, val)
end

b = ClassB(5)
type(b)       == 'table' # Because the class was written in Lua
torch.type(b) == 'ClassB'
b:type() # exception; Custom Torch classes have no :type() method by defauld

Утверждается, что Lua определяет "механизмы, а не политику". Классы - это "политика". Вы можете реализовать эффект классов как угодно; Lua предоставляет множество механизмов, которые можно использовать для этого. Но в Lua нет единого способа объявления такой конструкции.

Стандартный метод type Lua возвращает только широкую категорию значения Lua: число, строка, таблица и т.д.. А поскольку в Lua есть только один вид структуры данных (таблица), любой класс (не созданный на языке C) будет иметь тип "таблица".

Это имеет побочный эффект, затрудняющий использование чужих политик в Lua. Например, если у Torch есть способ отличить свои собственные "классы" от обычных таблиц, это сработает. Но он не сможет отличить какую-то другую реализацию класса от обычной таблицы.

Так что нет общего способа отличить таблицу от какого-то "класса".

2022 WebDevInsider