3

文字列の配列からファイルのリストを作成する単純な Ruby スクリプトがあるため、次のようなメソッドがあります。

  def initialize( rootpath, name )
    @content = ""
     intermission = ""
     if ( ! (rootpath[-1] == "/" || name[0] == "/" ))
       intermission="/"
       end

     @path= "#{rootpath}#{intermission}#{name}"
     print "Open JavascriptFile from #{@path}" 
     if (! File.exists? @path)
       print "File does not exist!" 
       end
     File.open( @path ).each do |line|
       @content << line
       end
     end

これは、次の行に沿って呼び出されます。

 files= ['alice.js', 'bob.js', 'claire.js', 'dave.js']
 basepath= "/home/glenatron/projects/myJSProject/"
 files.each do |filename|
    myLoader.new( basepath, filename )
    end

IRB からクラスをロードして実行すると、次のようになります。

Open JavascriptFile from /home/glenatron/projects/myJSProject/alice.js
File does not exist!
Errno::ENOENT: No such file or directory - /home/glenatron/projects/myJSProject/alice.js

私が理解しているように、これはファイルが存在しないことを意味します。

ただし、ファイルが確実に存在するだけでなく、IRB ではまったく同じパスを貼り付けてその内容を確認できます。単純File.open("/home/glenatron/projects/myJSProject/alice.js").each { | line | print line }にファイルの完全な内容を明らかにします。では、Ruby クラスからではなく、直接のコマンド ライン リクエストからこれを実行できるのはなぜでしょうか? 私が渡しているフルパスではなく、ローカルパスを読み取ろうとしていますか?

4

2 に答える 2

5

ブロックでFile.open ..ラインをガード:else

 if (! File.exists? @path)
   print "File does not exist!" 
 else # <---
   File.open( @path ).each do |line|
     @content << line
   end
 end  # <----

ifまたはブロックの前に戻る:

 if (! File.exists? @path)
   print "File does not exist!" 
   return
 endif

それ以外の場合、ファイルが存在しない場合でも、コードは常にファイルを開こうとします。


File::joinパス コンポーネントを結合するために使用します。

File.join("/home/glenatron/projects/myJSProject/", "alice.js")
# => "/home/glenatron/projects/myJSProject/alice.js"
File.join("/home/glenatron/projects/myJSProject", "alice.js")
# => "/home/glenatron/projects/myJSProject/alice.js"

編集して解決策 (コメント内) を回答に含めます: 正確なパスを見つけるには、p @path- これにより、開こうとしていたパスが失敗したときに次のようになっていることが明らかになりました:/home/glenatron/projects/myJSProject/alice.js\rこれが問題の原因でした。これが明確になると、簡単@path.strip!に解決しました。

于 2013-11-08T16:21:20.350 に答える