2009-03-15 7 views
24

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

"\ text" 
'\ text' 

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

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

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

"\\ text" 
'\\ text' 

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

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

+0

После ваших изменений ваш вопрос в настоящее время по существу «является вики-материалами, которые в настоящее время обновлены для Ruby 1.9». Пожалуйста, отредактируйте заголовок вопроса, чтобы соответствовать этому. – bzlm

ответ

6

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

Из справки:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

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

+6

Из [«Как написать хороший ответ?»] (Https://stackoverflow.com/help/how-to-answer): «Приветствуются ссылки на внешние ресурсы, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваш друг пользователи будут иметь представление о том, что это такое и почему оно есть. Всегда указывайте наиболее значимую часть важной ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме ». –

3

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

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

+0

есть способ конвертировать строки двойной кавычки (интерполированные) в одинарные кавычки? –

+0

Я был бы удивлен, если бы не было! – bzlm

18

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

  • \a Bell/оповещения (0x07)
  • \b Backspace (0x08)
  • \e побег (0x1b)
  • \f Formford (0x0c)
  • \n Newline (0x0a)
  • \r Return (0x0D)
  • \s Space (0x20)
  • \t Tab (0x09)
  • \v Вкладка Вертикальная (0x0B)

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

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

Можно ли использовать одиночную обратную косую черту в двойных или одинарных кавычках? Я просто смущен, так как он, похоже, ничего не делает, но исчезает – thesowismine

4

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

Which style of Ruby string quoting do you favour?

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

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

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

7

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

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

"#{variable}" 

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

'The value of X is: '+X 

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

+0

Не верьте, что часть повышения производительности. Он не будет отображаться в тестах, потому что Ruby анализирует строку при загрузке файла, и разница исчезает. Мы сделали тест на SO где-то в одном из вопросов, с результатами, которые развенчали эту идею. * Если * есть повышение, оно крошечное и произойдет только во время запуска приложения. –

+0

@theTinMan: Как вы думаете, вы можете найти мне бенчмарк? Я бы хотел посмотреть на это. Теоретически, должно быть повышение производительности от необходимости искать escape-последовательности, но это всего лишь небольшая часть оптимизированного C, что было бы трудно отличить. – Linuxios

+0

В [benchmark] (http://stackoverflow.com/a/13039446/128421) речь шла о различных способах определения массивов. Я думаю, что такая же ситуация существует для строк, что различия удаляются при загрузке сценария, и один раз в памяти нет никакой реальной разницы. Легко написать тест, чтобы убедиться в этом на основе теста в этом ответе. –