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 воно повертає виконання
  до області видимості поза викликом функції. Зовнішній код відповідає за
  відновлення виконання функції. У Ruby `yield` виконує іншу функцію, що
  була передана як останній аргумент, і потім негайно відновлює виконання.
* Python підтримує лише один тип анонімних функцій — лямбди, тоді як Ruby
  має блоки, Procs і лямбди.
