Lua FILE*
- дескриптор ресурса, аналогичный std::ifstream
или std::ofstream
в C ++. Дескрипторы ресурсов предназначены для автоматического выделения и последующего освобождения ресурсов - фундаментальная концепция объектно-ориентированного программирования.
Lua FILE*
s имеет close
функций в своих метатаблицах, что вы и вызываете в своемпример с f:close()
. Это чтобы закрыть их явно. Но в стиле ООП они неявно закрываются с использованием метаметода __gc
. Вот пример, который я быстро написал, чтобы проверить это:
function myclose(self)
io.close(self)
io.stderr:write(string.format("File closed\n"))
return
end
file = assert(io.open("input.txt", "r"))
debug.getmetatable(file)["__gc"] = myclose
В последней строке я изменяю значение __gc
на myclose
;таким образом, когда время жизни этого FILE*
объекта заканчивается, myclose
вызывается вместо функции по умолчанию. Это означает, что «Файл закрыт» печатается в stderr
при выходе из сценария.
Итак, чтобы вернуться к исходному вопросу, нет необходимости явно закрывать файлы Lua.