Зміст | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11

Офіційний FAQ Ruby

If you wish to report errors or suggest improvements for this FAQ, please go to our GitHub repository and open an issue or pull request.

Як Ruby порівнюється з…?

Як Ruby порівнюється з Python?

Python і Ruby — об’єктно-орієнтовані мови, які забезпечують плавний перехід від процедурного стилю програмування до ООП. Smalltalk, навпаки, є лише об’єктною — ви не можете нічого робити, доки не зрозумієте об’єкти, наслідування та значну ієрархію класів Smalltalk. Надаючи процедурні “тренувальні колеса”, Python і Ruby “виправляють” одну з особливостей, яка могла стримувати Smalltalk від широкого поширення. Обидві мови підходять до цього рішення з протилежних боків.

Python — гібридна мова. Вона має функції для процедурного програмування та об’єкти для ООП. Python поєднує два світи, дозволяючи взаємне перетворення функцій і методів через явний параметр self у визначенні кожного методу. Коли функція вставляється в об’єкт, перший аргумент автоматично стає посиланням на одержувача.

Ruby — чиста ООП-мова, яка може виглядати як процедурна. У неї немає функцій, лише виклики методів. У методі Ruby одержувач, також званий self, — прихований аргумент, як this у C++. Оператор def поза визначенням класу, який у Python визначає функцію, насправді визначає метод у Ruby. Ці псевдофункції стають приватними методами класу Object, кореня ієрархії класів Ruby. Процедурне програмування вирішується з іншого боку — все є об’єктом. Якщо користувач ще не розуміє об’єкти, він може просто вважати, що def — це визначення функції, і все одно отримувати корисний результат.

ООП-чистота Ruby дає низку можливостей, яких Python не має або ще намагається досягти: єдина ієрархія типів/класів, метакласи, можливість успадковувати від будь-чого та уніфікований виклик методів (немає цієї плутанини “len() — це функція, але items() — метод”). Ruby, як і Smalltalk, підтримує лише одиничне наслідування, проте має дуже потужну концепцію міксинів: визначення класу може включати модуль, який вставляє методи, константи тощо цього модуля в клас.

Ruby, як і Smalltalk, надає замикання та блоки коду і використовує їх з такою ж користю. Класичні колекції Ruby та ітератори є відмінними — набагато потужнішими й елегантнішими, ніж ad hoc рішення, які з’являються в Python (лямбди та list comprehensions).

Синтаксис і філософія дизайну Ruby сильно вплинулися Perl. Він має багато синтаксичної варіативності. Модифікатори операторів (if, unless, while, until тощо) можуть з’являтися наприкінці будь-якого оператора. Деякі ключові слова необов’язкові (наприклад, then в операторі if). Дужки інколи можна опускати у викликах методів. Одержувача методу також часто можна опускати. Багато, дуже багато речей запозичено безпосередньо з Perl. Вбудовані регулярні вирази, $_ і компанія, heredoc-и, відмінність між рядками в одинарних та подвійних лапках, префікси $ і @ для розрізнення типів імен тощо.

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

Ruby значно складніший за Python, але його можливості здебільшого добре узгоджені між собою. Ruby добре спроєктований і повний гарних ідей, які можна використати для P3K. Я не впевнений, скільки Python-програмістів будуть ним зацікавлені — мене він поки не переконав (ще). Але він вартий серйозного вивчення і може стати реальною загрозою для Perl.

Опубліковано John Dell’Aquila у comp.lang.python, 11/17/2000. Відтворено з дозволу.