0

我正在为我的 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

4

1 回答 1

3

File.read不接受块,它将文件的内容作为字符串返回。你需要做:

@buffer += File.read(filename)

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

现在,如果您不介意,请提供一些建议:

  1. 不需要做@buffer,你可以简单地使用buffer
  2. 取而代之的是var += "string",你可以这样做var << string+创建一个新的 String 对象,同时<<就地修改它,因此更快更高效。无论如何你都在通过做它来改变它+=,所以<<也会做同样的事情。
  3. 如果使用 Ruby 2.0 ,您可以直接执行,而不是File.openthen 。file.writeFile.write

您的最终代码变为(未经测试):

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)

如果你想让它更实用,我有更多的建议,如果你想要一些,请发表评论。:)

于 2013-05-12T06:45:04.693 回答