Size: a a a

2019 July 31

IA

Ivan Azoyan in pro.lua
типа деструктор
источник

m

mihacooper in pro.lua
очень фиговый деструктор
источник

m

mihacooper in pro.lua
т.к. опциональный
источник

IA

Ivan Azoyan in pro.lua
потом проведи такой эксперимент:
mt = {}

mt.__close = function() print("close a") end
mt.__gc = function() print("gc a") end

local <toclose> a = {}
setmetatable(a, mt)
a = nil

Должно быть наоборот:
gc a
close a
источник

D

Dr. One in pro.lua
Так, ошибок нет.  "gc a" высветилось.
источник

IA

Ivan Azoyan in pro.lua
только gc a?
источник

D

Dr. One in pro.lua
ага
источник

IA

Ivan Azoyan in pro.lua
оу, я ошибся
источник

IA

Ivan Azoyan in pro.lua
local <toclose> a = {}
источник

IA

Ivan Azoyan in pro.lua
вот это исправь
источник

D

Dr. One in pro.lua
Хорошо сработало, без ошибок. Что это за колдунство?
источник

IA

Ivan Azoyan in pro.lua
а что вывелось? ответь на нужное сообщение выводом
источник

D

Dr. One in pro.lua
Всё. Все два принта.
источник

IA

Ivan Azoyan in pro.lua
последний эксперимент
источник

IA

Ivan Azoyan in pro.lua
потом будем экспериментировать дальше:
function foo()    
  mt = {}

 mt.__close = function() print("close a") end
 mt.__gc = function() print("gc a") end

 local <toclose> a = {}
 setmetatable(a, mt)

  return a
end

local d = foo()

print("======")
Должно быть:
close a
=======
gc a
источник

D

Dr. One in pro.lua
Верно.
источник

IA

Ivan Azoyan in pro.lua
колдунства никакого нет, вызов __close() возникает, когда переменная выходит из области видимости, в данном случае при выходе из функции
источник

IA

Ivan Azoyan in pro.lua
но сборка мусора не произошла, поэтому не вызвался метод __gc() Она произойдёт в конце программы
источник

D

Dr. One in pro.lua
Теперь более менее понятно что ты делал.
источник

IA

Ivan Azoyan in pro.lua
вроде таблица ещё жива __gc() не сработал, а __close() сработал
источник