字符串“<<”运算符在Ruby1.9.3中产生警告和意外结果

时间:2013-01-24 11:36:34

标签: ruby ruby-1.9.3

请查看我从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目录作为真正的目录路径。怎么做到的?

感谢。

2 个答案:

答案 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

这将解决您的警告:)