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

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

" text"
' text' 

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

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

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

" text"
' text' 

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

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

6 ответов


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

из ссылки:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

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


строки с двойными кавычками поддерживают полный диапазон escape-последовательностей, как показано ниже:

  • \a звонок/оповещение (0x07)
  • \b клавиша "Backspace" (бит 0x08)
  • \e побег (0x1b)
  • \f Formford (0x0c)
  • \n новая строка (0x0a)
  • \r Return (0x0d)
  • \s пробел (0x20)
  • \t Tab (0x09)
  • вертикальная (0x0b)

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

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

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

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

"#{variable}"

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

'The value of X is: '+X

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


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

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

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

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

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


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

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


можно сделать <%= f.label :nom_entreprise, "Nom de l'entreprise" %>