一种告诉对象是否支持方法

时间:2015-05-29 18:55:09

标签: ruby file scope

我正在尝试编写一些文件处理代码来打开文件,获取有关该文件的数据,然后关闭该文件。

我第一次遇到的问题是,如果我使用

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异常。

是否有一种干净的方式处理文件,允许我从中提取不同的统计信息(包括读取内容),以保证文件关闭,我不必预先定义所有变量以逃避块的范围? (如果这也适用于套接字句柄,则加分)

谢谢!

1 个答案:

答案 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