Что мы на самом деле подразумеваем под подобными объектами, таблицы имеют состояние STATE, а таблицы являются объектами в нескольких смыслах, программируя в ООП и структурах данных? - PullRequest
1 голос
/ 20 сентября 2019

я изучал язык roblox lua, и много раз я сталкивался с чем-то, что называется таблицей, имеет состояние, подобное строке объектов, и я действительно не понимаю этого, поскольку я не понимаю, как его визуализировать, например, что это на самом деле означает

Я читал эту статью о Roblox Lua и снова наткнулся на эту строку: объектно-ориентированное программирование (https://developer.roblox.com/en-us/articles/Object-Oriented-Programming)

, это часть этой статьи, и она содержит эту строку:

Поскольку Lua поддерживает типизацию утки с помощью Metatables, можно создавать возможность создания «объектов». Это, по сути, объектно-ориентированное программирование. Таблицы в Lua - это объект более чем в одном смысле.Как и объекты, таблицы имеют состояние. Как и объекты, таблицы имеют идентичность, которая не зависит от их значений, в частности, два объекта (таблицы) с одинаковым значением являются разными объектами, тогда как объект может иметь разные значения в разное время, ноэто всегда один и тот же объект. Как и объекты, таблицы имеют жизненный цикл, который яНезависимо от того, кто их создал или где они были созданы.

Может ли кто-нибудь помочь мне с этим, я пытался найти это в Google, но ничего похожего не появляется, например, что это на самом деле?подразумевать под таблицами как объекты?

1 Ответ

1 голос
/ 20 сентября 2019

Простой способ думать о таблицах состоит в том, что они являются словарями или ассоциативными массивами.Они также могут действовать как обычные массивы и списки.Но под капотом они хранят значения в системе пар ключ-значение.

Имея это в виду, давайте просто разбить этот абзац на каждую строку и поговорим о том, что все это значит.

1) Поскольку Lua поддерживает duck, набирая черезиспользование Metatables, способность создавать «объекты» может быть достигнута.Это по существу объектно-ориентированное программирование.

Это означает, что если объект ходит как утка и крякает как утка, можно разумно ожидать, что это утка.В Lua технически нет классов ООП, но мы можем заставить таблицы lua ходить и крякать, как классы ООП.

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

local TestClass = {}
TestClass.__index = TestClass

function TestClass.new()
    local tc = {
        secret = "hello world"
    }
    setmetatable(tc, TestClass)

    return tc
end
function TestClass:printSomething()
    print(self.secret)
end


-- construct a new "object" of TestClass, and call one of its functions
local a = TestClass.new()
a:printSomething()

То, что здесь происходит, - TestClass перезаписывает свой метаметод __index.Это означает, что когда таблица пытается найти ключ в своей таблице, вместо поиска индекса из собственной таблицы, она будет использовать индекс таблицы TestClass.Функция new() создает новую таблицу, а затем перезаписывает ее метатабильную с помощью TestClass, гарантируя, что новая таблица будет вести себя так же, как и исходный объект TestClass.

Таким образом, даже если у объекта tc нет явно определенной функции new() или printSomething(), вызов функций для этого объекта все еще работает.Вот как Луа может притворяться объектно-ориентированным.

2) Таблица в Lua - это объект в нескольких смыслах.Как и объекты, таблицы имеют состояние.

Это просто означает, что вы можете хранить вещи в таблицах, например, в контейнере.

local a = {
    foo = 5
}

print(a.foo) -- 5

3) Как и объекты, таблицы имеютидентичность, которая не зависит от их ценностей;в частности, два объекта (таблицы) с одинаковым значением являются разными объектами ...

local a = {}
local b = {}

print(a == b) -- false
print(a == {}) -- also false

4) , тогда как объект может иметь разные значения в разное время, но это всегдатот же объект.

local a = {
    foo = 5
}
print(a) -- some table pointer id
a.foo = 10
print(a) -- still the same table pointer

5) Как и у объектов, таблицы имеют жизненный цикл, который не зависит от того, кто их создал или где они были созданы.

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

local function createTable()
    -- make a local table to this function
    local a = {}

    -- make a table to return to the program
    local b = {
        c = a
    }
    print("a = ", a) -- some table pointer
    print("b = ", b) -- some other table pointer
    return b
end

-- a is no longer in scope, and in other languages would be cleaned up
-- but since b holds a reference to it, it is not removed.
local d = createTable()
print("d =", d)  -- should print out b's table pointer
print("d.c = ", d.c) -- should print out a's table pointer

Надеемся, это прояснит ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...