请查看我从IRB
终端运行的代码:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\rakshiar>irb
irb(main):001:0> src = 'E:\WIPData\Ruby\Scripts\TaxDocumentDownload'
=> "E:\\WIPData\\Ruby\\Scripts\\TaxDocumentDownload"
irb(main):002:0> dest = 'E:\WIPData\Ruby\Scripts'
=> "E:\\WIPData\\Ruby\\Scripts"
irb(main):003:0> dest<<'H00371101'
=> "E:\\WIPData\\Ruby\\ScriptsH00371101"
irb(main):004:0>
为什么会出现这样的\\
?如何解决?
当我从脚本运行相同的部分时收到以下警告:
CODE
src = 'E:\WIPData\Ruby\Scripts\TaxDocumentDownload'
dest = 'E:\WIPData\Ruby\Scripts'
dest<<'H00371101'
FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
警告: 的
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\rakshiar>cd..
C:\Documents and Settings>cd..
C:\>e:
E:\>cd E:\WIPData\Ruby\Scripts
E:\WIPData\Ruby\Scripts>downloadv1.rb
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:93: warning: already initialized constant
OPT_TABLE
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1268: warning: already initialized consta
nt S_IF_DOOR
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1496: warning: already initialized consta
nt DIRECTORY_TERM
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1500: warning: already initialized consta
nt SYSCASE
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1619: warning: already initialized consta
nt LOW_METHODS
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1625: warning: already initialized consta
nt METHODS
你能说出为什么会出现这样的警告吗?
从IRB
再次尝试以下不同的输出:
C:\Documents and Settings\rakshiar>irb
irb(main):001:0> src = "E:\WIPData\Ruby\Scripts\TaxDocumentDownload"
=> "E:WIPDataRubyScriptsTaxDocumentDownload"
irb(main):002:0> est = "E:\WIPData\Ruby\Scripts"
=> "E:WIPDataRubyScripts"
irb(main):003:0> est<<"H00371101"
=> "E:WIPDataRubyScriptsH00371101"
irb(main):004:0> est<<"H00371101"
修改 的
ERROR
E:\WIPData\Ruby\Scripts>downloadv1.rb
E:/WIPData/Ruby/Scripts/downloadv1.rb:87: syntax error, unexpected tCONSTANT, ex
pecting $end
dest<<"H00371101"
^
来自脚本代码部分:
src = "E:\WIPData\Ruby\Scripts\TaxDocumentDownload"
dest = "E:\WIPData\Ruby\Scripts\"
dest<<"H00371101"
FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
我希望src and dest
目录作为真正的目录路径。怎么做到的?
感谢。
答案 0 :(得分:3)
从广义上讲,Ruby有两种类型的字符串。在双引号字符串中,反斜杠“转义”字符 - 反斜杠后跟另一个字母产生一个特殊字符。例如,"\n"
会为您提供换行符。在单引号字符串中,反斜杠不会转义字符 - '\n'
只是一个反斜杠后跟字母n
。 (实际上这不是100%正确,例外是'\''
这是单引号 - 否则就无法在单引号字符串中嵌入单引号。
这就是为什么你的单引号src = 'E:\WIPData\Ruby\Scripts\TaxDocumentDownload'
会起作用,双引号src = "E:\WIPData\Ruby\Scripts\TaxDocumentDownload"
不会。
由于irb
在结果输出上使用inspect
,因此会在那里打印双反斜杠,这会以双引号形式返回字符串(转义特殊字符):
'"Hello," said Andy'.inspect # => "\"Hello,\" said Andy"
他们并不真正在字符串中,正如您可以看到puts
:
puts '"Hello," said Andy' # => "Hello," said Andy
您遇到的错误是因为使用双引号字符串,反斜杠被视为转义字符,因此您的字符串未被终止:
src = "E:\WIPData\Ruby\Scripts\"
dest<<"H00371101"
的解析与
相同src = 'E:WIPDataRubyScripts"dest<<'H00371101
这是语法错误。
你应该去阅读单引号和双引号字符串之间的区别。 Here's one resource
快速谷歌建议你可能require 'FileUtils'
而不是require 'fileutils'
? This post说,一旦他们改为后者,同样的警告就会消失。这是因为Windows的文件系统不区分大小写 - 对于Ruby,FileUtils.rb和fileutils.rb是两个不同的文件,但对于Windows,它们是相同的。
答案 1 :(得分:0)
FileUtils警告是因为您必须更改所需的gem,如下所示:
require 'FileUtils' WRONG
require 'fileutils' OKAY
这将解决您的警告:)