Двойные и одинарные кавычки

172

Я действительно новичок в Ruby , и я пытаюсь понять , если есть время конкретного когда я должен использовать ""против ''.

Я использую одинарные кавычки большую часть времени, потому что это легче набирать, но я не уверен, что должен.

например get 'user/new'противget "user/new"

imjp
источник
12
Вы уверены, что это вопрос RoR, а не только вопрос Ruby?
Игнасио Васкес-Абрамс
Существует ли соответствующее руководство по стилю при выборе, когда интерполяция строк не требуется?
Уильям Энтрикен

Ответы:

202

" " позволяет выполнять интерполяцию строк, например:

world_type = 'Mars'
"Hello #{world_type}"
Jits
источник
1
В общем, просто используйте двойные кавычки все время, верно?
Неконари
8
Нет - двойные кавычки просто допускают интерполяцию строк. Если вам не нужна интерполяция строк, вам не следует использовать двойные кавычки.
Пан
4
Нет смысла использовать двойные кавычки только тогда, когда вам нужна интерполяция, это не оказывает существенного влияния на производительность, и это просто заставит вас думать, что вы должны использовать. Просто используйте строки в двойных кавычках.
Матеус
137

кроме интерполяции, другое отличие состоит в том, что «escape-последовательность» не работает в одинарных кавычках

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 
lfx_cool
источник
42
За исключением экранирования одинарных кавычек, например 'don\'t'.
Sparhawk
3
Это очень полезный ответ на этот вопрос. Я никогда не понимал, что одиночные кавычки предназначены для печати буквально всего между одинарными кавычками, за исключением кавычек, которые нужно избегать. Спасибо.
Джей Годсе
6
И попробуй обратную косую черту. puts '\\'Она напечатает только одну косую черту. смотрите здесь stackoverflow.com/questions/25499046/…
Hardik
да, это только два случая, которые вы можете избежать с помощью одинарных кавычек
Алексис
@Alexis не уверен, возможно небольшая разница в производительности
lfx_cool
40

Чтобы ответить на ваш вопрос, вы должны использовать, ""когда вы хотите выполнить интерполяцию строк:

a = 2
puts "#{a}"

В противном случае используйте простые кавычки.

Кроме того, если вам интересно, есть ли разница в производительности, у StackOverflow есть отличный вопрос по этому поводу.

И если вы действительно новичок в RoR, я призываю вас взять приличную книгу по Ruby, чтобы выучить основы языка. Это поможет вам понять, что вы делаете (и удержит вас от мысли, что Rails - это магия). Я лично рекомендую The Well-заземленный Rubyist .

Амокране Чентир
источник
34

Существует разница между одинарными ''и двойными кавычками ""в Ruby с точки зрения того, что должно быть оценено как строка.

Вначале я хотел бы уточнить, что в буквальной форме строки все, что находится между одинарными или двойными кавычками, оценивается как строковый объект, который является экземпляром класса Ruby String.

Следовательно, 'stackoverflow'и "stackoverflow"оба будут оценивать экземпляры класса String без разницы вообще .

Различия

Существенное различие между двумя буквальными формами строк (одинарные или двойные кавычки) заключается в том, что двойные кавычки допускают escape-последовательности, а одинарные кавычки - нет!

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

Хороший пример:

"\n" # will be interpreted as a new line

в то время как

'\n' # will display the actual escape sequence to the user

Интерполяция с одинарными кавычками не работает вообще:

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..

Лучшая практика

Поскольку большинство Ruby Linters предлагают использовать литералы одинарных кавычек для ваших строк и использовать двойные в случае интерполяции / экранирования последовательностей.

aloucas
источник
1
Итак, если бы у вас были a = '\ n' и b = "# {a}", было бы b интерпретировано как новая строка или как escape-последовательность?
NathanTempelman
4
В тот момент, когда вы присваиваете a = '\ n' a, интерпретируется как "\\ n" путем интерполяции a к b, вы не получите новую строку. b оценивается как "\\ n" (без новой строки вы получаете escape-последовательность) a = '\ n' => "\\ n", где a = "\ n" => "\ n"
aloucas
6

Строки в одинарных кавычках не обрабатывают управляющие коды ASCII (\ n, \ t и т. Д.) И не выполняют интерполяцию строк, в то время как двойные кавычки выполняют обе функции.

Пример кода Escape:

2.4.0 :004 >   puts 'Hello \n World'
Hello \n World

2.4.0 :005 > puts "Hello \n World"
Hello
World

Пример интерполяции:

2.4.0 :008 >   age=27
 => 27

2.4.0 :009 > puts 'Age: #{age}'
Age: #{age}

2.4.0 :009 > puts "Age: #{age}"
Age: 27
Имран Ахмад
источник
4

Аналогично ответу "\ n" при печати, следующий пример различий

puts "\1"  -> get special character
puts '\1'  -> get \1

похоже, что * был преобразован в экранированный символ в двойных кавычках, но не в одинарных. Кстати, это повлияет на вывод при использовании в регулярном выражении, например, str.gsub (/ регулярное выражение /, '\ 1, \ 2')

Брайан Лю
источник
2

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

Этот шаблон регулярного выражения будет работать, потому что передается в одинарных кавычках:

"123 ABC".match('\d')
=> #<MatchData "1">

Этот шаблон регулярного выражения потерпит неудачу, потому что передан в двойных кавычках (вам придется дважды экранировать его, чтобы заставить его работать):

"123 ABC".match("\d")
=> nil
Ярина
источник
-8

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

Geo
источник
4
Они не эквивалентны, так как двойные кавычки позволяют интерпретировать строки.
Джейсон Нобл
7
Вы читали часть «В данном конкретном случае», прежде чем сделать это чрезвычайно умное наблюдение?
Geo
9
Да, но его вопрос был, когда использовать одинарные или двойные кавычки.
Джейсон Нобл