Перехід на Ruby з Python
Python — ще одна дуже хороша мова програмування загального призначення. Переходячи з Python на Ruby, ви побачите, що синтаксису трохи більше, ніж у Python.
Подібності
Як і в Python, у Ruby…
- Є інтерактивний режим (називається
irb). - Документацію можна читати в командному рядку (через
riзамістьpydoc). - Немає спеціальних термінаторів рядків (окрім звичайного нового рядка).
- Літерали рядків можуть охоплювати кілька рядків, як у Python з потрійними лапками.
- Дужки — для списків, фігурні дужки — для словників (у Ruby вони називаються “hash”).
- Масиви працюють так само (додаванням утворюють один довгий масив, але
композиція
a3 = [ a1, a2 ]дає масив масивів). - Об’єкти мають строгі та динамічні типи.
- Усе є об’єктом, а змінні — це лише посилання на об’єкти.
- Хоча ключові слова трохи різняться, винятки працюють приблизно так само.
- Є вбудовані інструменти документації (у Ruby це rdoc).
- Є гарна підтримка функціонального програмування з функціями першого класу, анонімними функціями та замиканнями.
Відмінності
На відміну від Python, у Ruby…
- Рядки змінювані.
- Можна створювати константи (змінні, значення яких ви не плануєте змінювати).
- Є певні конвенції регістру (наприклад, назви класів починаються з великої літери, змінні — з малої).
- Є лише один тип контейнера для списків (Array), і він змінюваний.
- Рядки в подвійних лапках підтримують escape-послідовності (наприклад,
\t) і спеціальний синтаксис підстановки виразів (який дозволяє вставляти результати Ruby-виразів у рядки без необхідності"додавати " + "рядки " + "разом"). Рядки в одинарних лапках схожі наr"raw strings"у Python. - Немає “new style” і “old style” класів. Є лише один вид. (У Python 3+ цієї проблеми немає, але він не повністю сумісний з Python 2.)
- Ви ніколи напряму не звертаєтеся до атрибутів. У Ruby це завжди виклики методів.
- Дужки у викликах методів зазвичай необов’язкові.
- Для контролю доступу є
public,privateіprotected, замість Python-ових_voluntary_підкреслень__convention__. - Використовуються “міксини” замість множинного наслідування.
- Ви можете додавати або змінювати методи вбудованих класів. Обидві мови дозволяють відкривати та змінювати класи в будь-який момент, але Python забороняє змінювати built-ins — Ruby ні.
- Є
trueіfalseзамістьTrueіFalse(іnilзамістьNone). - При перевірці на істинність лише
falseіnilдають хибне значення. Усе інше — істинне (включно з0,0.0,""і[]). - Це
elsifзамістьelif. - Це
requireзамістьimport. В іншому використання подібне. - Коментарі у звичному стилі над рядками (а не docstrings під ними) використовуються для генерації документації.
- Є низка скорочень, які хоч і додають того, що треба запам’ятати, але швидко засвоюються. Вони роблять Ruby веселим і дуже продуктивним.
- Немає способу «видалити» змінну після встановлення (як оператор
delу Python). Ви можете скинути змінну вnil, дозволивши старому вмісту бути прибраним збирачем сміття, але змінна залишиться в таблиці символів, доки її область видимості існує. - Ключове слово
yieldповодиться інакше. У Python воно повертає виконання до області видимості поза викликом функції. Зовнішній код відповідає за відновлення виконання функції. У Rubyyieldвиконує іншу функцію, що була передана як останній аргумент, і потім негайно відновлює виконання. - Python підтримує лише один тип анонімних функцій — лямбди, тоді як Ruby має блоки, Procs і лямбди.