Избавляемся от экземпляра класса в Lua

В настоящее время я пытаюсь использовать ООП в Lua. Из того, что я понял, здесь, пример класса и даже сама класс (переменная) являются ссылкой на различные биты и бобы, которые содержит класс, поэтому, если у меня есть метод: destroy (), состоящий из

function class:destroy()
  self = nil
end

когда я вызываю instance:destroy(), ссылка пример должна быть подхвачена уборщик мусора, и практически экземпляр как в объекте исчезает.

Это не вызовет ошибку и не вызовет медленную утечку памяти, верно?

Обновлено: Я подумал, что, возможно, мне также следует включить следующее.

Это метод, который я использую для создания и экземпляра

function class:new(obj)
  obj = obj or {}
  setmetatable(o,self)
  self.__index = self
  return o
end
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Принцип подстановки Лискова
Принцип подстановки Лискова
Принцип подстановки Лискова (LSP) - это принцип объектно-ориентированного программирования, который гласит, что объекты суперкласса должны иметь...
1
0
208
1

Ответы 1

Как правило, вам не нужно ничего делать, чтобы избавиться от экземпляра или любого другого типа таблицы. Сборщик мусора автоматически освобождает память любой таблицы, на которую ничто не ссылается. Если вам действительно нужно освободить часть памяти до того, как таблица выйдет за пределы области видимости, просто назначьте nil ее переменной, а все остальное сделает сборщик мусора.

Ваш метод destroy не имеет никакого эффекта, потому что self - это просто параметр (который является локальной переменной). Назначение напрямую ему не может повлиять ни на что, что видит вызывающий.

Поэтому вместо того, чтобы писать причудливое: destroy (), я должен просто напрямую выполнить instance = nil?

Pipi Caca 24.12.2018 22:52

Да, но даже в этом нет необходимости, если вы не знаете, что у вас мало памяти.

luther 24.12.2018 22:55

@ Bogdan705: Даже установка переменной экземпляра на nil ничего не гарантирует. У других людей может быть ссылка на этот объект, поэтому объект будет продолжать существовать. Это не означает, что вы не должен удаляете ссылки на объекты, которые больше не нужны вашему локальному коду, но если вы не уверены, что ни у кого другого в любом месте нет ссылки на него, вы не должны предполагать, что таких ссылок не существует.

Nicol Bolas 25.12.2018 18:58

Другие вопросы по теме