Обратные косые черты в одиночных кавычках по сравнению с двойными кавычками

Если я добавлю обратную косую черту + пробел в начало двойных и одинарных кавычек, я получаю разные результаты:

"\ text"
'\ text' 

В выводе для строки с двойными кавычками я вижу только пробел.
В выводе для одиночной кавычки я вижу обратную косую черту + пробел.

Что там происходит? Это потому, что '\ ' интерпретируется как специальный символ в строке двойной кавычки, но в одиночной кавычной строке символы сохраняются как?

Если я изменил строки на это, я увижу один и тот же вывод, а именно одну косую черту, за которой следует пробел, а затем текст:

"\\ text"
'\\ text' 

В обоих случаях обратная косая черта сбрасывается. Я смущен, почему они работают одинаково в этой ситуации.

Есть ли какое-то правило, которое поможет объяснить фундаментальное различие между тем, как одиночные кавычки и строки с двойными кавычками обрабатывают обратные косые черты в Ruby?

Ответ 1

Я бы назвал вас Ruby Programming/Strings" для очень кратким, но всеобъемлющим обзором различий.

Из справки:

puts "Betty pie shop"

puts 'Betty\ pie shop'

Поскольку "Betty's" содержит апостроф, который является тем же самым символом, что и одиночная кавычка, во второй строке нам нужно использовать обратную косую черту, чтобы избежать апострофа, чтобы Ruby понимал, что апостроф находится в строковом литерале вместо маркировки конец строкового литерала. Обратная косая черта, сопровождаемая одиночной цитатой, называется escape-последовательностью.

Ответ 2

Строки с двойными кавычками поддерживают весь диапазон управляющих последовательностей, как показано ниже:

  • \a Bell/alert (0x07)
  • \b Backspace (0x08)
  • \e Escape (0x1b)
  • \f Formford (0x0c)
  • \n Новая строка (0x0a)
  • \r Возврат (0x0d)
  • \s Пробел (0x20)
  • \t Вкладка (0x09)
  • \v Вертикальная вкладка (0x0b)

Для строк с одной кавычкой две последовательные обратные слэши заменяются одной обратной косой чертой, а обратная косая черта, сопровождаемая одной цитатой, становится одной цитатой:

'escape using "\\"' -> escape using "\"
'That\ right'     -> That right

Ответ 3

Ruby интерпретирует только escape-последовательности в двойных кавычках. В одной кавычной строке только \\ (обратная косая черта обратной косой черты) и \' (обратная косая черта) берутся как специальные символы. Вы должны использовать строки с двойными кавычками только тогда, когда вам требуется больше интерпретации. В противном случае одинарные кавычки обеспечивают повышение производительности.

Когда вы упомянули, включая имя переменной, Ruby никогда этого не делает. Просто имя переменной рассматривается как больше строкового литерала. Чтобы включить значение переменной (или любого выражения), поместите выражение следующим образом:

"#{variable}"

Обратите внимание, что это работает только в двойных кавычках. Чтобы добавить переменную в одиночный кавычек, вам нужно сделать следующее:

'The value of X is: '+X

Если вам требуется серьезное форматирование, загляните в рубиновую версию sprintf и printf. Они довольно много оберток вокруг функций C и достаточно мощны, но немного громоздки в использовании.

Ответ 4

Это не полный ответ (поскольку уже был задан простой вопрос), а скорее дополнительная информация.

Какой стиль строки для строки Ruby вы предпочитаете?

Не используйте двойные кавычки, если вам нужно избегайте их. И не попадайте в "сингл" против двойных кавычек ". отличная поддержка произвольных разделители для строковых литералов:

http://rors.org/2008/10/26/dont-escape-in-strings

Я принял этот совет и никогда не оглядывался!

Ответ 5

Это потому, что '\' интерпретируется как особый символ в строка двойной кавычки, но в одинарная кавычка символов сохраняются как?

Да. Строки с одним кавычком рассматриваются как литералы; Интерполируются строки с двойными кавычками. Это то же самое на других языках, подобных Ruby, и не изменилось в версии 1.9.