假设我想将passwd
内容存储在变量中,就像这样:
local passwd = io.open('/etc/passwd', 'r'):read('a')
读取后我没有关闭文件可以吗?我应该这样重写吗:
local f = io.open('/etc/passwd', 'r')
local passwd = f:read('a')
f:close()
我知道第一段代码可以工作,但是我不能,如果它会引起一些隐藏的问题。
我正在使用Lua 5.3
Lua FILE*
是类似于C ++中的std::ifstream
或std::ofstream
的资源句柄。资源句柄旨在自动分配然后再分配资源-这是面向对象编程中的基本概念。
Lua FILE*
在其元表中具有close
函数,这是您在示例中使用f:close()
调用的内容。这是要明确关闭它们。但是,在OOP风格中,它们使用__gc
元方法implicitly关闭。这是我快速写过的一个例子来测试这个:
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文件。