我正在使用CarrierWave
并发现自己一直这样做:
fin = File.open(payload_file_name,'rb')
self.payload = fin
fin.close
其中payload
是我的CarrierWave
字段。我考虑过这样做:
self.payload = File.open(payload_file_name,'rb')
但我担心它会让文件保持打开状态,我的应用服务器最终会耗尽文件指针。是否有Rubyism可以让我将一个简单块的返回值赋给变量?
答案 0 :(得分:3)
使用带open
的块:
File.open(payload_file_name,'rb') do |fin|
self.payload = fin.read
end
你可以将它进一步减少到一行,但它不能完成任何额外的任务:
File.open(payload_file_name,'rb') { |fin| self.payload = fin.read }
您也可以使用read
:
self.payload = File.read(payload_file_name, :mode => 'rb')
但是你在阅读完文档之后就知道了这一切,对吧?
答案 1 :(得分:0)
使用IO::read
:
self.payload = File.read(payload_file_name, mode: 'rb')
答案 2 :(得分:0)
您可以将块传递给File.open(),它将在块完成执行后自动关闭。像(未经测试)的东西:
File.open('payload_file_name', 'rb') do | file |
# do stuff with file
end
或单线版。
File.open('payload_file_name', 'rb') {|file| # do stuff }