一种判断对象是否支持某一方法的方法



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

我遇到的第一个问题是,如果我使用
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异常。

是否有一种干净的方式来处理文件,允许我从它拉不同的统计(包括读取内容)的方式,我可以保证文件关闭,我不需要预定义所有的变量来转义块的作用域?(如果这也适用于套接字句柄,则额外加分)

谢谢!

你总是可以在该方法调用中添加一个条件,如果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

相关内容

  • 没有找到相关文章

最新更新