Hello winscript-talks,
http://ruby.boxload.net/lection.php?lect=f21
Сравнение 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 просто выдающиеся, намного более мощные и элегантные,
чем аналогичные ad hoc решения в Python -- лямбда и обработка списков.
На синтаксис и дизайн Ruby сильно повлиял Perl. Ruby имеет синтаксическую вариативность.
Модификаторы выражений (if, unless, while, until и другие) могут следовать после любого
выражения. Некоторые служебные слова опциональны (например, then в условной конструкции).
Скобки в вызове метода могут быть иногда опущены. self может быть опущен. Довольно многие
вещи пришли прямо из Perl. Встроенные регулярные выражения, /usr/local/apache/bin/httpd и
его друзья, встроенные документы, разница между двойными и одинарными кавычками, префиксы $ и @
для различения разных типов переменных и так далее.
Если вам нравится 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.
Воспроизведено с разрешения автора.
--
Best regards,
Max mailto:be...@ma...
http://belugin.newmail.ru ICQ:9406811
|