Ruby和File.read

Ruby和File.read,ruby,file,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 |conten

我正在为我的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
但是,它不起作用<代码>@缓冲区始终为空

以下是调试过程:

(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
中,
文件.read可以正常工作。但是,如果我将
调试器
断点放在
文件.read
块中,它就不会进入调试器。这意味着块本身永远不会执行

另外,我检查了文档,没有提到File.read。

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

%w{crypto/sjcl.js miner.js}.each do |filename|
  File.open(filename, 'r') do |file|
    @buffer << file.read
  end
end
%w{crypto/sjcl.js miner.js}。每个do|文件名|
打开(文件名为'r')do |文件|

@buffer
File.read
不接受块,它以字符串形式返回文件内容。您需要执行以下操作:

@buffer += File.read(filename)
调试器显示内容的原因是它打印函数调用的返回值

现在,如果你不介意的话,请提供一些征求意见:

  • 无需执行
    @buffer
    ,您只需使用
    buffer

  • 您可以执行
    var
    文件,而不是
    var+=“string”
    。read
    不接受块,它将文件内容作为字符串返回。您需要执行以下操作:

    @buffer += File.read(filename)
    
    调试器显示内容的原因是它打印函数调用的返回值

    现在,如果你不介意的话,请提供一些征求意见:

  • 无需执行
    @buffer
    ,您只需使用
    buffer

  • 您可以使用
    var+=“string”
    ,而不是
    var,因为我喜欢在整个文件中使用类变量,这样它就突出了,我可以看到它的变化。感谢您向我解释
    File.read的工作原理。我通常使用@JanNetherdrake,你指的是实例变量,可能应该开始将不必要的变量视为代码气味@Dogbert暗示这可能更实用。事实上:
    File.write('../server/index.html',Uglifier.compile(%w{crypto/sjcl.js miner.js}.map{fn | File.read(fn)}.join))
    @dbenhur,是的,这就是我要建议的!)是的,实例变量。这只是我自己的一个小构建脚本,所以我没有重构它。但是我很欣赏这些技巧。谢谢。我喜欢用类变量来表示我在整个文件中使用的东西,只是为了让它脱颖而出,让我看到它在哪里变异。感谢您向我解释
    File.read的工作原理。我通常使用@JanNetherdrake,你指的是实例变量,可能应该开始将不必要的变量视为代码气味@Dogbert暗示这可能更实用。事实上:
    File.write('../server/index.html',Uglifier.compile(%w{crypto/sjcl.js miner.js}.map{fn | File.read(fn)}.join))
    @dbenhur,是的,这就是我要建议的!)是的,实例变量。这只是我自己的一个小构建脚本,所以我没有重构它。但是我很欣赏这些技巧。非常感谢。