Официальный FAQ по Ruby
If you wish to report errors or suggest improvements for this FAQ, please go to our GitHub repository 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 в comp.lang.python, 11/17/2000. Воспроизведено с разрешения.