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 回答
0

从问题中显示的代码来看,看起来像 anend而不是 an else,例如

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

应该

 if (! File.exists? @path)
   print "File does not exist!" 
 else
   File.open( @path ).each do |line|
   @content << line
   end  # THIS end is valid as it ends a `.each` block
 end
于 2013-11-08T16:45:40.207 回答