Подвійні проти одиничних котирування


171

Я дійсно новачок в Ruby , і я намагаюся зрозуміти , якщо є час конкретного коли я повинен використовувати ""проти ''.

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

наприклад get 'user/new'vsget "user/new"


12
Ви впевнені, що це питання RoR, а не лише питання Ruby?
Ігнасіо Васкес-Абрамс

Чи є відповідне керівництво стилем щодо вибору, коли інтерполяція рядків не потрібна?
Вільям Ентрікен

Відповіді:


202

" " дозволяє робити рядкову інтерполяцію, наприклад:

world_type = 'Mars'
"Hello #{world_type}"

1
Отже, просто використовуйте подвійні лапки весь час, правда?
nekonari

8
Ні - подвійні лапки просто дозволяють проводити інтерполяцію рядків. Якщо ви не хочете рядок інтерполяції, то не слід використовувати подвійні лапки.
Пан

4
Немає підстав використовувати подвійні лапки лише тоді, коли вам потрібна інтерполяція, немає значного впливу на продуктивність, і це просто змусить вас думати, що вам потрібно використовувати. Просто використовуйте рядки з подвійним цитуванням.
Матеус

137

крім інтерполяції, інша відмінність полягає в тому, що "послідовність втечі" не працює в одній цитаті

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 

42
За винятком уникнення самих цитат, наприклад 'don\'t'.
Спархак

3
Це дуже корисна відповідь на це питання. Я ніколи не усвідомлював, що одноцитування - це друк буквально всього між цитатами, за винятком цитат, які необхідно уникати. Дякую.
Джей Годсе

6
І схил нахилу також спробуйте. puts '\\'Він буде надрукувати лише одну косу рису. дивіться тут stackoverflow.com/questions/25499046 / ...
Hardik

Так, це єдині два випадки, коли можна врятуватися за допомогою однієї цитати
Алексіс

@Alexis не впевнений, можливо, невелика різниця у виконанні
lfx_cool

40

Щоб відповісти на ваше запитання, вам потрібно використовувати, ""коли ви хочете зробити інтерполяцію рядків:

a = 2
puts "#{a}"

Використовуйте прості цитати інакше.

Крім того, якщо вам цікаво, чи є різниця в продуктивності, на StackOverflow є відмінне запитання про це.

І якщо ви справді новачок у RoR, я закликаю вас взяти гідну книгу Ruby, щоб вивчити основи мови. Це допоможе вам зрозуміти, що ви робите (і не дасть вам думати, що Рейки - це магія). Я особисто рекомендую добре обґрунтований рубіст .


34

Існує різниця між одинарними ''та подвійними лапками ""в Ruby з точки зору того, що підлягає оцінці для рядка.

Спочатку я хотів би уточнити, що в прямому вигляді рядка все, що знаходиться між одинарними або подвійними лапками, оцінюється як об'єкт рядка, що є екземпляром класу Ruby String.

Отже, 'stackoverflow'і "stackoverflow"обидва оцінюватимуть екземпляри класу String взагалі без різниці .

Різниця

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

Строковий літерал, створений одинарними лапками, не підтримує рядкову інтерполяцію і не уникає послідовностей.

Прекрасний приклад:

"\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 пропонують використовувати літерали з одною цитатою для ваших рядків і перейти до подвійних у випадку інтерполяції / уникнення послідовностей.


1
Отже, якби у вас були a = '\ n' і b = "# {a}", чи буде інтерпретуватися b як новий рядок або як послідовність втечі?
NathanTempelman

4
У момент, коли ви призначите a = '\ n' a, інтерпретується як "\\ n" шляхом інтерполяції a до b, ви не отримаєте новий рядок. b буде оцінено як "\\ n" (жоден новий рядок ви не отримаєте послідовність відходу). a = '\ n' => "\\ n" де як a = "\ n" => "\ n"
aloucas

6

Рядки з одним котируванням не обробляють ASCII коди виходу (\ n, \ t і т. Д.), І вони не виконують стропову інтерполяцію, тоді як подвійне цитування робить обидва.

Приклад уникнення коду:

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

так виглядає, як * було перетворено в уникнутий символ у подвійних лапках, але не в одиничних лапках. BTW, це вплине на вихід при використанні в регулярному виразі, наприклад, str.gsub (/ регулярний вираз /, '\ 1, \ 2')


2

Ще одна причина, по якій ви хочете використовувати одиночні лапки - це при передачі шаблону регулярних виразів у вигляді рядка:

Цей шаблон регулярного вираження спрацьовує, оскільки передається в межах однієї лапки:

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

Цей шаблон регулярного вираження не вдасться, оскільки передається в подвійних лапках (вам доведеться подвійно уникати його, щоб змусити його працювати):

"123 ABC".match("\d")
=> nil

-8

У цьому конкретному випадку немає значення, як ви це пишете. Вони рівноцінні. Також ви можете прочитати ще кілька посібників / навчальних посібників Ruby :)


4
Вони не рівноцінні, оскільки подвійні лапки дозволяють проводити інтерпретацію рядків.
Джейсон Благородний

7
Ви читали "У цьому конкретному випадку" частину, перш ніж робити це надзвичайно розумне спостереження?
Гео

9
Так, але його питання полягав у тому, коли використовувати сингли проти подвійних лапок.
Джейсон Благородний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.