我正在为我的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
答案 0 :(得分:3)
File.read
不接受块,以字符串形式返回文件的内容。你需要这样做:
@buffer += File.read(filename)
debugger
显示内容的原因是因为它打印了函数调用的返回值。
现在,对于一些征求意见的建议,如果你不介意:
@buffer
,您只需使用buffer
var += "string"
代替var << string
。 +
创建一个新的String对象,而<<
就地修改它,因此更快更有效。无论如何,你通过+=
进行变异,所以<<
会做同样的事情。File.open
而不是file.write
,而不是File.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)
如果您想让它更具功能性,我会提出更多建议,如果您愿意,请发表评论。 :)