_If you wish to report errors or suggest improvements for this FAQ,
please go to our
[GitHub repository](https://github.com/ruby/www.ruby-lang.org/)
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](mailto:jbd@alum.mit.edu) у comp.lang.python,
11/17/2000. Відтворено з дозволу.
