Чому інтерполяція рядків працює в Ruby, коли немає фігурних дужок?


90

Правильний спосіб використання інтерполяції рядків у Ruby такий:

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"

Саме таким способом я маю намір його завжди використовувати.

Однак я помітив щось дивне в інтерполяції рядків Рубі. Я помітив, що інтерполяція рядків працює в Ruby без фігурних дужок щодо змінних екземпляра. Наприклад:

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"

І те, що пробувати те саме, що і інстанція змінної, не працює.

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"

Я спробував це з успіхом як в 1.9.2, так і в 1.8.7.

Чому це працює? Що тут робить перекладач?

Відповіді:


103

Згідно з мовою програмування Ruby Фланагана та Мацумото:

Коли вираз, який буде інтерпольовано у рядковий літерал, є просто посиланням на глобальну змінну, екземпляр або клас, тоді фігурні дужки можуть бути опущені.

Отже, все повинно працювати:

@var = "Hi"
puts "#@var there!"  #=> "Hi there!"

@@var = "Hi"
puts "#@@var there!" #=> "Hi there!"

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"

4
Класне питання, до речі. Приємно повернутися назад і знайти маленькі куточки мови, про яку я забув.
tsherif

2
Хоча ваша відповідь не містить причини, чому або що відбувається, я вважаю, що причину важко визначити. Навіть старі дошки оголошень, про які Мац часто коментував, не допомагають. Однак ваша відповідь показує, що це особливість, на відміну від просто випадковості.
Чарльз Колдуелл,

1
Я не впевнений, що ви очікуєте як привід. Ви маєте на увазі дизайнерське рішення? Я припускаю, що це була спроба синтаксису, схожого на Perl , оскільки я вважаю, що Ruby спочатку задумувався як свого роду Perl ++, перш ніж увійти в нього.
шериф

2
Я повний нуб, і щойно моя IDE скаржилася, що я це роблю. Але я важко працюю, переконуючи себе, що це хороший стиль. Це безглуздо непослідовно і має мінус - наприклад, якщо у мене є змінна екземпляра @distance зі значенням 100 і я хочу створити рядок, що говорить щось на зразок "100m", використовуючи вираз типу "# @ distancem", я просто отримаю порожній рядок тому що немає змінної екземпляра 'distancem'. Тож це звучить як відвертий поганий стиль.
страшна

3
@terriblememory О, це однозначно поганий стиль. Ось чому я розпочав своє запитання, вказавши правильний спосіб це зробити. Однак мені просто здалося дивним, що це взагалі особливість мови, і здивувався, чому це працює. Знову ж таки, це також поганий стиль - починати речення сполучником. Але ви все одно побачите, як люди використовують його тут і там. =)
Чарльз Колдуелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.