Lua:是否必须关闭文件?

问题描述 投票:1回答:1

假设我想将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

file lua io fopen fclose
1个回答
0
投票

Lua FILE*是类似于C ++中的std::ifstreamstd::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文件。

© www.soinside.com 2019 - 2024. All rights reserved.