Сравнение Ruby и Python'а

Python и Ruby оба являются объектно-ориентированными языками программирования, которые обеспечивают плавный переход от процедурного стиля к объектно-ориентированному. Smalltalk же, напротив, является исключительно объектно-ориентированным - вы не сможете ничего сделать, пока не поймете суть объектов, наследование и внушительную иерархию классов Smalltalk'а. Допуская процедурный подход в качестве некоторого подспорья на время изучения OO, Python и Ruby исправляют то, что мешало Smalltalk'у стать широко используемым, но они отличаются тем, что решают эту проблему разными способами.

Python - смешанный язык. В нем есть функции для процедурного программирования и объекты для объектно-ориентированности. Python соединяет эти два мира, позволяя функциям и методам преобразовываться друг в друга, используя эксплицитный параметр self в каждом определении метода. Когда функция помещается в класс, первый аргумент автоматически становиться ссылкой на сам объект.

Ruby - это полностью объектно-ориентированный язык, который может "притворяться" процедурным. В нем нет функций, есть только методы. В методе Ruby сам объект, также называемый self, является скрытым аргументом, как this в С++. Определение (def) вне тела класса (то, что в Python является функцией) - это на самом деле метод. Эти заменители функций становятся private методами класса Object, верхнего класса в иерархии классов Ruby. Проблема процедурного программирования элегантно решена с другого конца - все есть объект. Если пользователь пока не понимает объекты, он может использовать def как определение функции, и все будет работать.

Полная объектно-ориентированность Ruby порождает некоторое количество свойств, отсутствующих в Python, или только появляющихся в нем: единая иерархия типов/классов, возможность наследоваться от всех классов, и единый способ вызова методов (нет такого, что len() - это функция, а items() - это метод).
Ruby, как и Smalltalk, допускает только единичное наследование, но имеет очень мощное средство - mix-in, суть его в том, что класс может включить в себя модуль, и все методы и переменные модуля становятся методами и переменными класса.

Ruby, опять же как Smalltalk, имеет замыкания и блоки кода, и использует их так же хорошо, как и Smalltalk. Классы коллекций в Ruby просто выдающиеся, намного более мощные и элегантные, чем аналогичные решения в Python - лямбда и обработка списков.

На синтаксис и дизайн Ruby сильно повлиял Perl. Ruby имеет синтаксическую вариативность. Модификаторы выражений (if, unless, while, until и другие) могут следовать после любого выражения. Некоторые служебные слова опциональны (например, then в условной конструкции). Скобки в вызове метода могут быть иногда опущены. self может быть опущен. Довольно многие вещи пришли прямо из Perl. Встроенные регулярные выражения, $_ и его друзья, встроенные документы, разница между двойными и одинарными кавычками, префиксы $ и @ для различения разных типов переменных и так далее.

Если вам нравится Perl, c синтаксисом Ruby вы сразу почувствуете себя дома. Если вам нравится Smalltalk, вы
почувствуете себя дома благодаря семантике Ruby. Если вам нравится Python, может случится такое (а может, и нет), что Ruby вам не пойдет, так как дизайн Python сильно отличается от дизайна Ruby/Perl.

Ruby гораздо более сложный, чем Python, но его особенности в основном очень хорошо сочетаются друг с другом. Дизайн Ruby очень хорош и полон элегантных идей, которые следует рассмотреть для следующей версии Python. Хотя я и не знаю, насколько многим программистам на Python они понравятся. Но Ruby достоин серьезного изучения и мог бы стать реальной угрозой Perl.

Письмо Джона Делл'Аквилы (John Dell'Aquila) в группу comp.lang.python, датированное 11/17/2000. Воспроизведено с разрешения автора.

Вход для пользователей