Отже, чому творцям Рубі довелося використовувати поняття symbols
в мові?
Ну, вони не суворо "повинні", вони вирішили. Також зауважте, що строго кажучи Symbol
s не є частиною мови, вони є частиною основної бібліотеки. Вони дійсно мають буквальний синтаксис мови на рівні, але вони будуть працювати так само добре , якщо ви повинні були побудувати їх по телефону Symbol::new
.
Я запитую з точки зору нерубінного програміста, який намагається це зрозуміти. Я вивчив багато інших мов і виявив, що в жодній із них не потрібно вказувати, маю справу чи ні з тим, що називає Рубі symbols
.
Ви не сказали, що таке "багато інших мов", але ось лише невеликий уривок мов, що мають Symbol
тип даних, як Рубі:
- ECMAScript , також JavaScript
- Скала
- Схема , звичайний Lisp , Clojure (також, у Clojure є ключові слова ), в основному кожна мова в сім'ї Лісп, її наступники та двоюрідні брати мають їх
- Smalltalk , Newspeak та багато інших мов сімейства Smalltalk (імовірно, звідки їх отримав Ruby), включаючи Objective-C (хоча і в обмеженій формі)
- Ерланг (званий атомами ) , також Еліксир і LFE
- Юлія
- Пролог (званий атомами ), імовірно, звідки їх отримав Ерланг
Існують також інші мови, які надають функції Symbol
s в іншій формі. Наприклад, у Java особливості Ruby's String
розділені на два (фактично три) типи: String
і StringBuilder
/ StringBuffer
. З іншого боку, особливості типу Ruby Symbol
складені у String
тип Java: Java String
s може бути інтернований , буквальні рядки та String
s, які є результатом константних виразів часу компіляції, автоматично інтернуються, динамічно генеровані String
s можуть бути інтерновані шляхом виклику String.intern
метод. Інтернований String
в Java точно такий же, як Symbol
у Ruby, але він не реалізований як окремий тип, це просто інший стан, ніж JavaString
(Примітка. У більш ранніх версіях Ruby, які String#to_sym
раніше називались, String#intern
і цей метод існує і сьогодні як попередній псевдонім.)
Основним питанням може бути: чи існує концепція symbols
в Ruby як наміри виконання над собою та іншими мовами,
Symbol
s - це перш за все тип даних із конкретними семантикою . Ці семантики також дозволяють реалізувати деякі оперативні дії (наприклад, швидке тестування рівності O (1)), але це не головна мета.
чи просто щось, що потрібно для існування через спосіб написання мови?
Symbol
s взагалі не потрібні мові Ruby, без них Ruby буде добре працювати. Вони суто бібліотечна особливість. Є точно одне місце в мові, яке пов'язане з Symbol
s: def
вираз визначення методу оцінюється до Symbol
позначення імені методу, який визначається. Однак це досить недавня зміна, до цього повернене значення просто не було визначено. МРТ просто оцінювали nil
, Рубіній оцінював Rubinius::CompiledMethod
об'єкт тощо. Це також можна було б оцінити доUnboundMethod
… чи просто а String
.
Чи буде програма в Ruby легшою та / або швидшою, ніж її, скажімо, аналог Python або Node? Якщо так, то це було б черезsymbols
?
Я не впевнений, що ви тут просите. Продуктивність - це переважно питання якості впровадження, а не мови. Крім того, Node навіть не є мовою, це рівномірний фреймворк вводу / виводу для ECMAScript. Запуск еквівалентного сценарію на IronPython та MRI, IronPython, швидше за все, буде швидшим. Запуск еквівалентного сценарію на CPython та JRuby + Truffle, JRuby + Truffle, швидше за все, буде швидшим. Це не має нічого спільногоSymbol
s, але з якістю реалізації: JRuby + Truffle має агресивно оптимізуючий компілятор, а також весь механізм оптимізації високопродуктивного JVM, CPython - це простий інтерпретатор.
Оскільки одним із намірів Рубі є легко читати та писати людині, чи не могли її творці полегшити процес кодування, впровадивши ці вдосконалення в самому інтерпретаторі (як це може бути в інших мовах)?
№ Symbol
s не є оптимізацією компілятора. Вони є окремим типом даних із специфічною семантикою. Вони не схожі на флори YARV , які є приватною внутрішньою оптимізацією для Float
s. Ситуація не така, як Integer
, Bignum
і Fixnum
, що має бути непомітною деталлю внутрішньої оптимізації, але, на жаль, не є. (Це, нарешті, буде виправлено у Ruby 2.4, який видаляєтьсяFixnum
і Bignum
і листя просто Integer
.)
Це робиться так, як це робить Java, оскільки особливий стан нормального String
s означає, що вам завжди потрібно бути обережними, чи перебувають ваші String
s у такому спеціальному стані, і за яких обставин вони автоматично перебувають у такому спеціальному стані, а коли ні. Це набагато більший тягар, ніж просто мати окремий тип даних.
Чи існувало б мовно-агностичне визначення символів та причина їх застосування іншими мовами?
Symbol
- це тип даних, що позначає поняття імені або етикетки . Symbol
s - ціннісні об'єкти , незмінні, як правило, негайні (якщо мова відрізняє таку річ), без громадянства і не мають ідентичності. Два Symbol
рівні, які рівні, також гарантуються однаковими, іншими словами, двомаSymbol
s, які рівні, насправді однакові Symbol
. Це означає, що ціннісна рівність і референтна рівність - це одне і те ж, і, отже, рівність є ефективною і O (1).
Причини мати їх у мові дійсно однакові, незалежно від мови. Деякі мови покладаються на них більше, ніж інші.
У родині Лісп, наприклад, немає поняття "змінна". Натомість у вас єSymbol
пов'язані значення.
У мовах з відбивають або самосозерцательнимі можливостями, Symbol
s часто використовується для позначення назви відображених сутностей в API , відображення, наприклад , в Ruby, Object#methods
, Object#singleton_methods
, Object#public_methods
, Object#protected_methods
, і Object#public_methods
повертати Array
з Symbol
ї (хоча вони могли б точно так же повертати Array
з Method
с). Object#public_send
приймає Symbol
позначення імені повідомлення для надсилання в якості аргументу (хоча воно також приймає aString
а, Symbol
є більш семантично правильним).
У ECMAScript Symbol
s є основоположним складовим елементом забезпечення безпечності можливостей ECMAScript у майбутньому. Вони також відіграють велику роль у роздумах.