0

JavaScript 用のビルド自動化スクリプトを作成しています。これまで使用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..."

ご覧のとおり、では正常irbFile.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.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)

より機能的にしたい場合は、さらに提案があります。ご希望の場合はコメントしてください。:)

于 2013-05-12T06:45:04.693 に答える