如何将此代码缩小为单行?

时间:2014-01-21 03:28:39

标签: ruby-on-rails ruby carrierwave

我正在使用CarrierWave并发现自己一直这样做:

fin = File.open(payload_file_name,'rb')
self.payload = fin
fin.close

其中payload是我的CarrierWave字段。我考虑过这样做:

self.payload = File.open(payload_file_name,'rb')

但我担心它会让文件保持打开状态,我的应用服务器最终会耗尽文件指针。是否有Rubyism可以让我将一个简单块的返回值赋给变量?

3 个答案:

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