From: Max B. <be...@ma...> - 2003-11-10 09:29:50
|
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 |