Перехід на 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 і Falsenil замість None).
  • При перевірці на істинність лише false і nil дають хибне значення. Усе інше — істинне (включно з 0, 0.0, "" і []).
  • Це elsif замість elif.
  • Це require замість import. В іншому використання подібне.
  • Коментарі у звичному стилі над рядками (а не docstrings під ними) використовуються для генерації документації.
  • Є низка скорочень, які хоч і додають того, що треба запам’ятати, але швидко засвоюються. Вони роблять Ruby веселим і дуже продуктивним.
  • Немає способу «видалити» змінну після встановлення (як оператор del у Python). Ви можете скинути змінну в nil, дозволивши старому вмісту бути прибраним збирачем сміття, але змінна залишиться в таблиці символів, доки її область видимості існує.
  • Ключове слово yield поводиться інакше. У Python воно повертає виконання до області видимості поза викликом функції. Зовнішній код відповідає за відновлення виконання функції. У Ruby yield виконує іншу функцію, що була передана як останній аргумент, і потім негайно відновлює виконання.
  • Python підтримує лише один тип анонімних функцій — лямбди, тоді як Ruby має блоки, Procs і лямбди.