我正在尝试编写一些文件处理代码来打开文件,获取有关该文件的数据,然后关闭该文件。
我第一次遇到的问题是,如果我使用
File.open(...) do |fd|
var = fd.size
end
打开一个确保最后关闭的文件的方法,我内部的所有变量都限制在该块的范围内。
解决这个问题的一种方法是预定义块之外的所有变量,但这似乎不正确......
我的另一个解决方案是使用ensure
块关闭所有句柄,如下所示:
def test(file)
return if file == nil || file == ""
fd = File.open(file, ...)
var = fd.size
ensure
fd.close
end
但如果文件句柄不存在或未创建,或者在处理错误之前对逻辑执行此操作,那么ensure
块会抛出一个nil:NilClass异常。
是否有一种干净的方式处理文件,允许我从中提取不同的统计信息(包括读取内容),以保证文件关闭,我不必预先定义所有变量以逃避块的范围? (如果这也适用于套接字句柄,则加分)
谢谢!
答案 0 :(得分:1)
如果fd为nil,你总是可以对该方法调用设置条件。
ensure
fd.close if fd
end
您还可以使用:respond_to?如果你真正想要的是检查是否支持该方法
ensure
fd.close if fd.respond_to? :close
end
如果你想获得幻想,Rails有一个帮助方法(你可以借用)来尝试将方法发送到一个对象。 http://apidock.com/rails/Object/try
您可以将代码更改为
ensure
fd.try(:close)
end