2011-05-04 43 views
1

为什么我从这两个投入有不同的结果?检查给我\但只放

test_string = "C:/Program Files/TestPro/TestPro Automation Framework/" 
puts test_string.gsub("/","\\\\") 

#result is : C:\Program Files\TestPro\TestPro Automation Framework\ 

puts 
puts test_string.gsub("/","\\\\") .inspect 

#result as desired : C:\\Program Files\\TestPro\\TestPro Automation Framework\\ 

回答

2

Ruby的String.inspect转义所有特殊字符,这就是为什么你SEEE “\\” 与.inspect

见String.inspect source这里

if (c == '"'|| c == '\\' || 
    (c == '#' && 
    p < pend && 
    MBCLEN_CHARFOUND_P(rb_enc_precise_mbclen(p,pend,enc)) && 
    (cc = rb_enc_codepoint(p,pend,enc), 
     (cc == '$' || cc == '@' || cc == '{')))) { 
    if (p - n > prev) str_buf_cat(result, prev, p - n - prev); 
    str_buf_cat2(result, "\\"); 
    prev = p - n; 
    continue; 
} 

基本上,if c == '\',串连“\”到它,所以它成了“\\

如果你想双转义反斜线,你需要尝试与

test_string = "C:/Program Files/TestPro/TestPro Automation Framework/" 
puts test_string.gsub("/","\\\\\\\\") 

#C:\\Program Files\\TestPro\\TestPro Automation Framework\\ 
2

puts将返回第一个斜杠作为转义符号。 Inspect不会触发转义斜线,因此它会显示原始字符串。

string = "\\Hello World!\\" 
puts string 
#=> "\Hello World!\" 
string 
#=> "\\Hello World!\\" 

所以,如果你会尝试这一点,将工作:

puts "I am in \"Dog Bar\" now" 
#=> "I am in "Dog Bar" now" 
"I am in \"Dog Bar\" now" 
#=> "I am in \"Dog Bar\" now" 
"I am in "Dog Bar" now" 
#=> SyntaxError: compile error 
+1

你是正确的,但措辞是相反的 - 'puts'会按原样输出字符串(也就是说,所有的转义字符都会在屏幕上被解析为产生相应的字符),而'inspect'会跳过所有的转义序列,以便它们在屏幕上显示,而不会被解析。 – Laas 2011-05-04 08:18:47

+0

是的,在翻译中丢失:)但我的想法是一样的 – fl00r 2011-05-04 08:31:56

+0

当然。这就是为什么我没有添加其他答案。 – Laas 2011-05-04 08:57:27