Обратная косая черта в строках с одинарными кавычками или в строках с двойными кавычками - PullRequest
25 голосов
/ 15 марта 2009

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

"\ text"
'\ text' 

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

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

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

"\\ text"
'\\ text' 

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

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

Ответы [ 6 ]

20 голосов
/ 15 марта 2009

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

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

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

'escape using "\\"' -> escape using "\"
'That\'s right'     -> That's right
9 голосов
/ 26 ноября 2011

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

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

"#{variable}"

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

'The value of X is: '+X

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

7 голосов
/ 15 марта 2009

Я бы отослал вас к " Ruby Programming / Strings " для очень краткого и полного обзора различий.

Из обращения:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

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

4 голосов
/ 16 марта 2009

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

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

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

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

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

3 голосов
/ 15 марта 2009

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

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

0 голосов
/ 04 октября 2018

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

...