Ruby сверкающий рубин программирования
заметка, посвященная языку программирования Ruby
Итак, Ruby.
Что из себя представляет данный язык программирования и почему, собственно, достаточно молодой язык пользуется не меньшей популярностью, чем такие гиганты, как Python и PHP. Начнем мы с определения и истории.
Ruby (англ. – рубин) — это интерпретируемый язык высокого уровня, рассчитанный на быстрое и удобное объектно-ориентированное программирование. Язык обладает независимой от ОС реализацией многопоточности, динамической типизацией, корзиной для сбора мусора и многими другими возможностями. По особенностям синтаксиса Ruby близок к языкам Perl и Eiffel, а по методам объектно-ориентированного подхода – к Smalltalk. Также в Ruby имеется множество заимствованных черт Python, CLU, Dylan, Lisp.
Реализация интерпретатора языка является кроссплатформенной и распространяется как Open Source Software.
Создатель языка Ruby – японец Юкихиро Мацумото (также известный как Matz), родился 14 апреля 1965 года. Еще будучи студентом, он интересовался языками программирования, однако идея о создании собственного языка пришла к нему гораздо позже – Ruby начал разрабатываться в 1993 году, а вышел в свет два года спустя.
Основной целью разработки Мацумото было создание, как он сам говорит, «настоящего объектно-ориентированного» интерпретируемого языка программирования, который, кроме всего прочего, был бы легким в разработке. Прошло несколько месяцев, прежде чем интерпретатор заработал, и в декабре 1995 года Ruby 0.95 был опубликован в японских новостных группах, что можно официально считать датой рождения этого популярного ныне языка программирования.
Однако отсутствие документации на каком-либо другом языке, кроме японского, сдерживало дальнейшее развитие языка. И только в 1997 году появилось описание Ruby на английском, а в 1998 открылся форум Ruby-Talk, что дало старт развитию языка во всем мире. Сейчас Ruby входит в практически все дистрибутивы GNU/Linux, однако доступен пользователям и других операционных систем.
Прежде чем я перейду к достаточно скромному перечню причин, по которым стоит посмотреть на Ruby с интересом, стоит сказать еще пару слов о философии, неотъемлемым атрибуте японской культуры.
Основное назначение Ruby – это создание простых, но в то же время эффективных и понятных программ, где важна не скорость ее работы, а малое время разработки и простота синтаксиса. Ruby следует принципу «наименьшей неожиданности» — т. е. программа ведет себя так, как ожидает работающий с ней программист. Однако это не значит, что знакомство с языком не вызывает удивление – скорее, наоборот. Но при основательном изучении языка он ведет себя так, как от него этого ожидают.
Ruby и Perl схожи в том, что предоставляют программисту несколько возможностей достижения одного и того же результата – свобода выбора. Также одной из основных целей разработки было освобождение программиста от рутинной работы, которую, по идее, должен выполнять компьютер (и он делает это быстрее и качественнее). Особое внимание уделялось таким рутинным занятиям, как обработка текстов, администрирование, и для выполнения этих задач Ruby настроен очень хорошо.
Как уже говорилось, Ruby отличается от большинства языков программирования. В противовес машинно-ориентированным языкам, работающим быстро, целью создания Ruby была разработка среды, максимально дружественной и близкой к человеку. Язык позволяет максимально быстро и просто, для человека, выполнить задачу, пусть это и требует дополнительного времени работы компьютера.
Исторический и философический экскурс закончен, перейдем к примерам работы языка, исследованию его возможностей, делающих Ruby легким для изучения и простым для работы. Ruby включает в себя множество полезных инструментов, заимствованных из других языков программирования.
Исключения – Ruby поставляется с блоками try/catch (или begin/rescue) и набором предопределенных, расширяемых исключений для удобной, простой и правильной обработки ошибок.
Пространства имен – то, что должно понравиться энтузиастам C++ и Java. Модули Ruby позволяют использовать пространство имен легко и непринужденно.
Встроенные регулярные выражения, для использования которых используется оператор “ =~”, подобно “/ /” в языке Perl.
Перезагрузка операторов – Ruby позволяет определять операторы типа +, -, > и многие другие для любого класса.
Пакеты Ruby, иначе называемые Gems (драгоценные камни), поддерживают зависимости, могут быть как кросс-платформенными, так и платформо-зависимыми.
Интерактивная консоль, подобно консоли языка Python, может использоваться для интерактивного тестирования кода.
Ruby очень нежен в своем подходе к программисту, язык не пытается использовать вас, а делает все возможное для упрощения его использования вами. Читабельность кода и понимание синтаксиса – это одно из неоспоримых достоинств данного языка.
Ruby позволяет равноценно использовать операторы if и unless в условных выражениях, однако использование unless приводит к меньшему числу ошибок. Кроме того, можно использовать операторы и в качестве условных модификаторов, ставя их после выражения: order.new unless order.exists
. Задать коду вопрос или прикрикнуть на него тоже возможно. Вопросительный и восклицательный знаки помогают понять суть метода: "?" используется, когда метод возвращает true или false, а знак "!" используется для необратимых методов наподобие удаления записи из базы данных, отщепления последнего символа строки и т. д.
Псевдонимы (alias) могут использоваться для уже созданных методов – таким образом, можно получить exist и exists без повторений.
В Ruby можно использовать директивы attr_reader, attr_writer, attr_accessor при автоматическом создании getter/setteer для членов класса.
Константы, классы и модули Ruby пишутся с заглавной буквы, методы и члены класса – с маленькой, глобальные переменные начинаются со знака $, имена переменных объекта – с @, а имена переменных класса — с @@, все это просто для понимания и легко запоминается.
При вызове методов совершенно не обязательно писать скобки, достаточно write File.open (“/home/user/test.txt”) или еще более простого File.open “/home/user/text.txt”. Это очень удобно при работе с методами без аргументов.
Нет необходимости использовать точку с запятой – если вы хотите написать следующую инструкцию, просто перейдите на новую строку. Enter — и готово. Как и в Python, новая линия разделяет инструкции.
В отличие от многих других языков программирования в Ruby все числа, символы, булевы значения и все-все-все остальное являются объектом. Ведь это объектно-ориентированное программирование, не так ли? Это означает, что можно написать так:
“YOU SHOULDN’T ALWAYS USE CAPITALS”.lowcase #, что даст вам “you shouldn’t always use capitals”
Это экономнее, проще и, в конце концов, логичнее, чем нечто вроде:
# PHP Code
strtolower(“YOU SHOULDN’T ALWAYS USE CAPITALS”)
В Ruby все имеет значение – больше не нужно использовать return для возврата значений. Все инструкции возвращают значение, даже присваивание переменных, поэтому не нужно использовать ключевое слово return в конце методов. Значение последнего присваивания всегда будет возвращено.
Представьте себе стандартную ситуацию: вы стали использовать системный класс или класс, написанный другим человеком, и вдруг осознали, что вам необходим дополнительный метод. В других языках программирования у вас есть несколько путей решения этой проблемы.
1. Вы изменяете исходный код класса, если у вас есть к нему доступ. Это плохая идея.
2. Вы наследуете свой класс от того и добавляете к нему метод. Это хорошая идея, но стоит ли того из-за одного метода? Кроме того, придется править другой свой код в соответствии.
3. Можно создать метод и вне класса. Это работает, но не изящно и идет вразрез с объектно-ориентированным программированием.
Ruby позволяет добавить метод в оригинальный класс без правки исходника. Даже для системного класса.
К примеру, мы хотим добавить метод для пересчета значений из метров в футы. Расширяем класс как Numeric, как показано в коде ниже:
class Numeric
def feet
self*3.2808399
end
end
С этого момента все числа будут иметь новый метод, который используется, как и любой другой:
5.feet # возвратит 16.4041955M
Классы в Ruby никогда не закрываются и могут быть расширены в любой момент.
XML – общеупотребительный язык разметки, который обрабатывается всеми языками программирования и повсеместно используется. Однако он громоздкий для написания, тяжелый для обработки и трудный для чтения. А что нам предлагает Ruby?
regexp: !ruby/regexp /a-zA-Z/
number: 4.
string: a string
Проще, не правда ли? Добро пожаловать в мир YAML, любимый, но далеко не единственный язык разметки Ruby, с помощью которого любой объект представлен в простом, но полном виде.
Хотя Ruby и способен работать с XML, простота YAML подкупила многих разработчиков, перешедших на него для, например, файлов конфигурации. Фрагмент, написанный выше, был получен исполнением кода:
{“string” => “a string”, “number” => 4.7, “regexp” => /a-zA-Z/}.to_yaml
Метод to_yaml определен для класса Object, который является прародителем всех остальных объектов, а потому доступен для всех объектов Ruby. Это позволяет преобразовывать любые объекты в YAML и обратно.
Из Lisp и Perl наш Ruby заимствовал объекты и блоки Proc. Proc – это блок кода, цитирую, «связанный с набором локальных переменных. Однажды связанные, они могут вызываться в различных контекстах и все еще обращаться к тем переменным». Взгляните:
def gen_times (factor)
return Proc.new {|n| n*factor }
end
times3 = gen_times (3)
times5 = gen_times (5)
times3.call (12) #=> 36
times5.call (5) #=> 25
times3.call (times5.call(4)) #=> 60
Это знакомо людям, работающим на Perl, Python или Lisp. Это можно сделать даже на PHP. Но кроме того, в Ruby используются блоки типа "несозданные Proc", например для итерации по содержимому объекта и исполнения некоторого кода, подобно методу each, доступному для класса Array: [1, 2, 4, 6, 8].each {|c| puts c*2} #=>, что возвратит каждый элемент, умноженный на 2.
Однако, кроме огромного количества перечисленных «вкусностей» языка, есть и неоспоримые минусы:
— уже упомянутая невысокая скорость работы программ, написанных на Ruby, что является естественной расплатой за простое написание сложных программ;
— отсутствие поддержки потоков операционной системы (однако для Unix/Linux-систем есть поддержка процессов ОС);
— отсутствие компиляции в байткод. Есть возможность компилирования Ruby в Java (с помощью JRuby) и .NET в байткод (используя Ruby.NET). Однако в версию 2.0 будет включена виртуальная машина YARV, компилирующая код в байткод и существенно ускоряющая исполнение.
И последнее по счету, но далеко не по важности. Вы всегда можете использовать фреймворк Ruby on Rails, написанный на Ruby, для использования веб-приложений. Возможно, это будет сложнее, чем на PHP, однако Rails были написаны на Ruby не просто так. Подробнее об этом в статье, всецело посвященной Ruby on Rails.
Источник: hostinfo.ru