_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, поддерживает только
одиночное наследование, но в нем есть очень мощная концепция примесей (mixin):
определение класса может включать модуль, который вставляет методы этого модуля,
константы и т.д. в класс.

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

Синтаксис и философия дизайна 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. Воспроизведено с разрешения.
