Ruby和File.read

时间:2013-05-12 06:31:06

标签: ruby file

我正在为我的javascripts构建构建自动化脚本。 我之前从未使用过File.read,但我已经决定尝试一下,因为它会保存一行代码。

所以这是我的代码:

require "uglifier"
require "debugger"

@buffer = ""

# read contents of javscripts
%w{crypto/sjcl.js miner.js}.each do |filename|
  debugger
  File.read(filename) do |content|
    @buffer += content
  end
end

# compress javascripts
@buffer = Uglifier.compile(@buffer)

# TODO insert js in html

# build the html file
File.open("../server/index.html", "w") do |file|
  file.write @buffer
end

但是,它不起作用。 @buffer始终为空。

以下是调试过程:

(rdb:1) pp filename
"crypto/sjcl.js"
(rdb:1) l
[4, 13] in build_script.rb
   4  @buffer = ""
   5  
   6  # read contents of javscripts
   7  %w{crypto/sjcl.js miner.js}.each do |filename|
   8    debugger
=> 9    File.read(filename) do |content|
   10      @buffer += content
   11    end
   12  end
   13  
(rdb:1) irb
2.0.0-p0 :001 > File.read(filename){ |c| p c }
 => "...very long javascript file content here..."

如您所见,在irb中,File.read工作正常。但是,如果我在debugger块中放置File.read断点,它永远不会进入调试器。这意味着块本身永远不会被执行?

另外,我已经检查了文档,并且没有提到File.read。 http://ruby-doc.org/core-2.0/File.html

我应该放弃它,还是我做错了什么?

%w{crypto/sjcl.js miner.js}.each do |filename|
  File.open(filename, 'r') do |file|
    @buffer << file.read
  end
end

这很好用。但是我仍然对File.read

感到好奇

1 个答案:

答案 0 :(得分:3)

File.read不接受块,以字符串形式返回文件的内容。你需要这样做:

@buffer += File.read(filename)

debugger显示内容的原因是因为它打印了函数调用的返回值。

现在,对于一些征求意见的建议,如果你不介意:

  1. 无需执行@buffer,您只需使用buffer
  2. 即可
  3. 您可以var += "string"代替var << string+创建一个新的String对象,而<<就地修改它,因此更快更有效。无论如何,你通过+=进行变异,所以<<会做同样的事情。
  4. 如果使用Ruby 2.0,则可以直接执行File.open而不是file.write,而不是File.write
  5. 您的最终代码变为(未经测试):

    require "uglifier"
    require "debugger"
    
    buffer = ""
    
    # read contents of javscripts
    %w{crypto/sjcl.js miner.js}.each do |filename|
      buffer << File.read(filename)
    end
    
    # compress javascripts
    buffer = Uglifier.compile(buffer)
    
    # TODO insert js in html
    
    # build the html file
    File.write("../server/index.html", buffer)
    

    如果您想让它更具功能性,我会提出更多建议,如果您愿意,请发表评论。 :)