#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. Да, потеряно при переводе 🙂 Но моя идея точно такая же