inspect дает мне \ но только для ввода

#ruby #escaping

#ruby #экранирование

Вопрос:

почему у меня разные результаты от обоих puts?

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

#result is : C:Program FilesTestProTestPro Automation Framework

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

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

Ответ №1:

Строка Ruby.inspect экранирует все специальные символы, вот почему вы видите « \ » с помощью .inspect

Смотрите String.inspect source здесь

 if (c == '"'|| c == '\' ||
    (c == '#' amp;amp;
     p < pend amp;amp;
     MBCLEN_CHARFOUND_P(rb_enc_precise_mbclen(p,pend,enc)) amp;amp;
     (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 вернет первые косые черты в качестве управляющего символа. Проверка не вызовет экранирующих косых черт, поэтому она показывает исходную строку.

 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 будет перепрыгивать через обручи, чтобы повторно экранировать все экранирующие последовательности, чтобы они отображались на экране без анализа.

2. Да, потеряно при переводе 🙂 Но моя идея точно такая же