-1

请找到我从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>

为什么\\会出现这种情况?如何解决?

当我从脚本运行相同的部分时,会收到以下警告:

代码

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"

编辑:

错误

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目录作为真正的目录路径。如何得到它?

谢谢。

4

2 回答 2

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

这是一个语法错误。

你应该去阅读单引号和双引号字符串之间的区别。这是一个资源


一个快速的谷歌建议你可能不这样require 'FileUtils'require 'fileutils'这篇文章说,一旦更改为后者,相同的警告就会消失。这是因为 Windows 的文件系统不区分大小写——对于 Ruby,FileUtils.rb 和 fileutils.rb 是两个不同的文件,但对于 Windows,它们是相同的。

于 2013-01-24T11:45:35.490 回答
0

FileUtils 警告是因为您必须更改所需的 gem,如下所示:

require 'FileUtils' WRONG
require 'fileutils' OKAY

这将解决您的警告:)

于 2014-11-05T12:21:52.497 回答