Litvek - онлайн библиотека >> Александр Неткачев >> Самиздат, сетевая литература и др. >> Быстрый курс Ruby

Александр Неткачев БЫСТРЫЙ КУРС RUBY

«Конец моим страданиям и разочарованиям»

Из песенки Вини-Пуха.

Введение

Название Ruby уже неоднократно попадалось мне на глаза на различных сайтах. К сожалению, я до сегодняшнего дня не находил времени исследовать Ruby. Почему к сожалению? Потому что это действительно замечательный язык и я это только сейчас узнал, что и стало поводом написать этот курс.

Курс ориентирован на читателей, которые уже знают какой-либо язык программирования и понимают магию, с помощью которой из набора разрозненных операторов получается нечто действительно полезное. Поэтому курс сокращен до предела и организован в виде блоков "задача — решение". Блоки сгруппированы в тематические разделы.

Особенности Ruby

Язык Ruby был задуман японским программистом Yukihiro Matsumoto в 1993 году как результат синтеза всех лучших черт языков программирования с целью максимально упростить создание программ. Результат синтеза в идеях языка изложен в документации по Ruby. Ниже представлены наиболее важные из них:

● Это интерпретируемый язык. В простейшем случае это означает, что стадия компиляции для него отсутствует. Это сокращает время, необходимое для создания программы.

● В Ruby переменная может хранить любой объект — можно сказать, что Ruby безтиповый язык, как PHP или Perl.

● Определять переменные не нужно. Для задания области видимости переменной используются приставки. Например $myVar — это глобальная переменная, а myVar — локальная.

● Garbage Collector освобождает от управления памятью. Объекты, на которыре не существует ссылок, автоматически выгружаются из памяти.

● Примитивные типы отсутствуют — любое значение является объектом.

● Поддержка основных концепций ООП.

● Чрезвычайно гибкая система итераторов.

● Части кода представлены как объекты

● Поддержка регулярных выражений и сходные с Perl методы работы с ними.

● В Ruby нет разделения на Integer, Long, Byte. Для целочисленных типов есть только один тип, в рамках которого можно проводить вычисления с произвольным количеством разрядов.

● Механизмы перехвата исключений (как в Java).

Другие особенности, которые мне особо понравились:

● Поддержка потоков

● Все операторы возвращают значения, в том числе управляющие структуры (if, case)

● return в конце функции не обязателен, возвращается значение последнего оператора. Например:

● def myFunction(a, b)

● a + b

● end

● puts myFunction(1, 2)

напечатает 3.

● Условия and и or возвращают элемент, эквивалентный true или первый элемент Например:

● puts 5 or 10 > 5

● puts 10 or nil > 10

● puts nil or 7 > 7

● puts nil and 10 > nil

Внимание программистам на C и производных: пустая строка и ноль не расцениваются как false. false — это только nil (null).

Установка Ruby

Gentoo Linux

Если у вас Gentoo Linux, то Ruby уже, скорее всего, будет установлен. Если же нет, то это досадное недоразумение исправляется очень легко.

$ emerge ruby

Далее можно переходить к установке дополнительных модулей или к первым программам на Ruby.

Установка дополнительных пакетов

Для Ruby есть большое количество различных библиотек и расширений. Доступные в Gentoo Linux можно посмотреть с помощью

$ emerge -s ruby

Кстати, если вы регулярно обновляете Portage, то, возможно, mod_ruby можно уже установить через "emerge mod_ruby". В моей версии его статус еще Masked.

mod_ruby

modruby.net — сайт Apache модуля mod_ruby. Установка крайне проста:

$ tar -xzf mod_ruby-1.0.7.tar.gz

$ cd mod_ruby-1.0.7

$./configure.rb --with-apxs=/path/to/apxs

$ make

$ make install

Затем редактируем файл настроек apache (httpd.conf или apache.conf) и добавляем в него следующее:

# загрузка модуля mod_ruby

LoadModule ruby_module /usr/lib/apache/mod_ruby.so

AddModule mod_ruby.c

# Настройка обработчиков для файлов *.rbx

<IfModule mod_ruby.c>

RubyRequire apache/ruby-run


<Location /ruby>

SetHandler ruby-object

RubyHandler Apache::RubyRun.instance

Options +ExecCGI

</Location>


<Files *.rbx>

SetHandler ruby-object

RubyHandler Apache::RubyRun.instance

Options +ExecCGI

</Files>


</IfModule>

Примечание: это немного расходится с примером, указанным в документации, но именно так у меня получилось запустить Ruby скрипты.

Для тестирования создайте в директории public_html файл hello.rbx вида

puts "Hello!"

Обращаемся к нему по ссылке (у вас может быть другая ссылка) "http://localhost/~alex/hello.rbx". Если отработало, значит все получилось. Если нет, обращайтесь, поможем, чем сможем.

Установка книги "Programming Ruby: The Pragmatic Programmers' Guide"

Авторы: Dave Thomas и Andrew Hunt

$ emerge dev-ruby/programming-ruby

Примечание: новая редакция книги находится на сайте phrogz.net

MySQL расширение для Ruby

$ emerge dev-ruby/mysql-ruby

Windows

Для установки в Windows достаточно скачать один из вариантов Ruby с http://ftp.ruby-lang.org/pub/ruby/binaries/ (я выбрал mswin32/ruby-1.8.1-20040402-i386-mswin32.zip). Далее распаковать и проставить правильно пути к директориям. Можно также воспользоваться пакетом автоматической установки RubyInstaller

Определить правильность установки поможет команда

C: \>ruby --help

Инструментарий языка

Управляющие структуры

if в несколько строк

if 1 > b

#…

elsif a == 1

#…

else

#…

end

if в одну строку

if 1 > b then 1 else 2 end

case

case node.type

when node.DocumentNode then

#…

else

#…

end

Постусловие

a = 1 if a > 1

Циклы

i = 1

while i < 10

puts i += 1

end


i = 1

puts i += 1 while i < 10

Использование mini-callbacks для организации циклов

Callback — это общее название, которым обозначают механизм задание части кода, который выполняется вызываемым методом. В различных технологиях используются указатели на функции (C/C++), динамический вызов функций (PHP/Perl). В Ruby задание callback можно осуществлять с помощью блоков кода. Блок передается за методом в волнистых скобках или в виде do… end. В начале блока идет перечисление параметров, с которыми он вызывается. Например |i| обозначает, что блоку передается один параметр и внутри этого блока он присваивается переменной i.

10.times { puts "I will use Google before asking questions\n" }

1.upto(3) { |i| puts "Iteration #{i}\n" }

10.downto(1) {|i| puts i}

(1..10). each {|i| puts i}

0.step(100, 10) {|i| puts i}

['January 1', 'February 23', 'March 8'].each { |holiday| p holiday }

%w{this is a test}.each{|i| p i}

Регионы

Регион используется для организации проверок и циклов. Он определяется начальным и конечным значением.

Создать регион

0..1 # 0, 1

0…4 # 0, 1, 2,