Язык ruby применение. Ruby для начинающих: чем интересен этот язык и как его эффективно изучать. Сложность обучения Ruby

  • Перевод

Я познакомился с Ruby сравнительно недавно, благодаря чудесному фреймворку Ruby on Rails . Я не считаю себя экспертом в Ruby, но я прочитал PickAxe, написал несколько утилит на Ruby для личного пользования, а также разрабатываю на Rails в свободное время.

Ruby на данный момент, мой основной язык. Начинал же я с TurboPascal в школе, изучал C и C++ в университете, дисертацию писал на Java , а еще я изучал PHP с нуля, так как хотел научиться делать веб-сайты быстро и легко. Думаю, что написание кода для меня это некая форма развлечения, а уж потом все остальное. В начале у меня были размышления, какой язык изучать, Python или Ruby. Я выбрал второй, так как не хотел, чтоб неправильные отступы были причиной неполадок в моем коде.

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

Это более скромный, неполный перечень причин, которые могут (или не могут) побудить вас использовать Ruby, ну или в крайнем случае поиграть с ним. Предостережение: если вы используете другой язык программирования для работы или в других целях - не жалуйтесь мне, если больше не захотите им пользоваться. Именно это и произошло со мной, но для меня это не столь важно. Ruby чудесный и элегантный язык и как многие подобные вещи, он может захватить ваш разум и поломать душу.

Короче, вы - предупреждены.

Зачем изучать Ruby?

1.Вы получаете все удобства (удовольствия) без уловок.

Ruby позаимствовал все лучшее из других языков программирования, от smalltalk до Java , от Perl до Python . Вот базовые возможности, которые вы в принципе могли видеть и в других языках:
  • Исключения. Верите или нет, исключения являются одной из важнейших вещей при разработке программ любого рода. Программисты на PHP4 , не знают ничего о них и будут говорить вам, что можно просто печатать(ошибки) на экран или использовать их собственный «супер-пупер» класс для обслуживания ошибок. К счастью для всех нас, Ruby поставляется с try/catch (или еще лучше begin/rescue ) блоками и набором предопределенных, расширяемых Исключений, для правильной обработки ошибок.
  • Пространства имен: модули Ruby делают использование пространства имен легким, это должно понравиться энтузиастам C++ и Java .
  • Встроенные регулярные веражения: Для всех знатоков Perl , вы можете заключить нечто в // и оно становится регулярным выражение, готовым для сравнения (для этого используем оператор =~ ).
  • Перегрузка операторов: Ruby позволяет определять операторы, такие как +, -, > , и т.д. для любого вашего класса.
  • Пакеты: называемые «gems »(камешки), они действительно оправдывают свое название, кроме того - они работают. Пакеты поддерживают зависимости, а еще могут быть как кросс-платформенные, так и платформо-зависимыми.
  • Интерактивная консоль: может использоваться для тестирования кода интерактивно, подобно консоли Python

2.Вы полюбите мелочи.

Ruby изящен. Почему? Потому-что он не старается делать код лаконичным настолько, что б это мешало читабельности и пониманию. Есть несколько советов, которые могут вам помочь:
  • Вы можите использовать оба оператора, if и unless в условных выражениях. Кончно же вы можите использовать if с противоположным значением выражения, но использования unless обычно приводит к меньшему числу ошибок. Кроме того, вы можите использовать оба оператора, как условные модификаторы, ставя их после выражения, а не до: order.new unless order.exists
  • Можно использовать знаки вопроса и восклицания в конце имени метода. Данное соглашение не навязывается, но знак «? » используется, когда метод возвращает true или false , в то время, как знак «! » используется для методов, делающих нечто необратимое, на подобии удаления записи из базы данных, отщепления последнего символа из строки и т.п.
  • Можно использовать псевдонимы (alias ) для уже созданных методов. Таким образом можно получить методы exist и exists , без накладных расходов и без повторений.
  • Вы можете использовать директивы attr_reader , attr_writer или attr_accessor для автоматического создания getter/setteer для членов класса.
  • И еще некоторое соглашение об именах: константы, классы и модули пишут с заглавной буквы, методы и члены класса должны начинатся с маленькой буквы, глобальные переменные именуют начиная с «$ », имена переменных объекта начинаются с «@ », а имена переменных класса с «@@ », ну и т.д.
  • При вызове методов, можно не писать скобки. Можно писать write File.open("/home/h3rald/test.txt") или просто File.open "/home/h3rald/test.txt" , что особенно удобно с методами, без аргументов.

3.Больше не нужно использовать точку с запятой.

Хотите написать следаующую инструкцию? Просто переходите на новую строку. Нажмите «Enter » и готово. В Ruby как и в Python , новая линия разделяет инструкции, так что вам не придется все время ставить точку с запятой. К сожалению это означает, что подобно фанатам C++ , мы не сможем написать программу в одну строчку. Но это не так уж и плохо, правда?

4.Все является объектом, как это и должно быть.

Когда я изучал Java , мне говорили, что все является объектом.
- «Че, 14 и 374346.678 - объекты?»
- «Нет, глупыш, это числа!»

В Ruby числа, символы, булевы значения и все остальное является объектом. Серьезно. Это означает, что можно писать вещи подобно этим:
"YOU SHOULDN"T ALWAYS USE CAPITALS".lowcase # вернет "you shouldn"t always use capitals" , вместо нечто такого:
# PHP Code
strtolower("YOU SHOULDN"T ALWAYS USE CAPITALS")
Этим вы экономите время, экономите скобки и так более логично.

5.Все имеет значение.

Или «больше не надо использовать return для возврата значений». Если побыстрячку, то так: все инструкции в Ruby возвращают значение, даже присваивание переменных, так что вам действительно не нужно использовать ключевое слово «return » в конце методов. Значение последнего присваивания всегда будет возвращено.

6.Можете изменять окружение любым доступным способом.

Впервые увидев это, я был впечатлен. Представьте типичную ситуацию: вы стали использовать системный класс или класс, написаный кем-то другим и поняли, что вам надо некий дополнительный метод в нем. Есть несколько путей для решения этой проблемы в типичных языках программирования:
  • Вы изменяете исходный код класса, если вы имеете к нему доступ. Но обычно это - плохая идея, не делайте так.
  • Вы наследуете свой класс от того и добавляете к нему новый метод. Обычно это - хорошая идея. Но из-за одного метода это может оказаться несколько монрообразным. Кроме того, придется немного подправить другой свой код соответственно.
  • Можно просто создать метод вне класса. Это сработает, но будет не очень изящно, а еще - идет в разрез с ООП .
В Ruby вы можете добавить метод в оригинальный класс, без правки исходных кодов. Это можно сделать даже для системного класса.
Мы хотим добавить метод, для пересчета значений из метров в футы? Просто расширим класс Numeric , как показано:
class Numeric
def feet
self*3.2808399
end
end

С этого момента, все наши числа, будут иметь новый метод, который может использоваться, как любой другой:
5.feet # возвратит 16.4041995
Классы в Ruby никогда не закрываются и могут быть расширены в любой момент, из любого места. Естественно использовать такую возможность надо с осторожностью!

7.Вы не сможите получать единорогов из птиц и конец, но вы получите ослов, если захотите.

Я четко помню, как моя учительница по C++ , использовала животных, для иллюстрации основных концепций объектно-ориентированного программирования - классов и наследования. Было нечто загадачно, когда объясняла нам множественное наследование, образовывая «пегаса» из «птиц» и «лошадей». Сумасшедшие вещи, Ruby не позволяет множественного наследования. Это выглядит как тренд и в конце-концов это дело вкуса. Я не в восторге от множественного наследования, так как это может привести к непредсказуемым вещам. Несмотря на это есть возможность создания нечто подобного, используя модули Ruby , так что переменные и методы одного модуля, будут добавлены в определенный класс, если модуль включен в него.

8. XML - реально ненужен.

XML - красивый, общеупотребительный, язык разметки, который может быть обработан всеми языками программирования и используется повсеместно. К сожалению, он слишком громоздкий для написания, трудный для обработки(парсинга) и, давайте будем честны - трудный для чтения в большинстве случаев. А вот взгляните на следующий фрагмент:
regexp: !ruby/regexp /a-zA-Z/
number: 4.
string: a string

Безусловно это легче и проще XML , правда? Добро похаловать в YAML , любимый (но не единственный) язык разметки Ruby , с помошью которого любой объект может быть представлен в простом, лаконичном, но полном виде.
Ruby способен работать с XML , но простота YAML подкупила многих разработчиков, которые теперь используют его вместо XML , например для файлов конфигурации (так поступили в Rails ). Фрагмент, представленный выше, был получен исполнением следующего фрагмента кода:
{"string" => "a string", "number" => 4.7, "regexp" => /a-zA-Z/}.to_yaml
Метод to_yaml , определен для класса Object , который является родителем для всех остальных объектов, а потому доступен для всех объектов Ruby . Это позволяет преобразовывать объекты в YAML и обратно, абсолютно прозрачно для разработчика. Круто, да?

9.Лямбда - нечто больше, чем просто греческая буковка.

Ruby позаимствовал некую магию из Lisp и Perl в объекты и блоки 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

Можно было использовать ключевое слово lambda вместо Proc.new , на результат это не влияет. Это могло показаться знакомым людям, знающим Perl и Python (или Lisp ). Такое можно сдалать даже на PHP , но не много людей пользуются этой возможностью.
Кроме того в Ruby широко используются блоки типа «несозданные Proc », например, для итерации по содержимому объекта и исполнения некоторого кода, подобно методу each , доступного для класса Array :
.each {|c| puts c*2} #=> возвратит каждый элемент, умноженный на 2
Если код не умещается на одной строчке, рекомендуется использовать конструкцию do… end , вместо использования скобок. Фаны Ruby не любят скобок.

10. Вы можете использовать Rails.

Последнее, но не по важности… Вы всегда можете использовать Rails для разработки веб-приложений. Разработка будет не настолько простой, как с PHP , но Rails были написаны на Ruby , поскольку он имет возможности, отсутствующие в других языках.

Заключение

Время вышло. Возможно вы уже задумываетесь о взгляде на Ruby , возможно вы уже пробовали его, а возможно вы просто проигнорировали его. Как бы там нибыло, в следующий раз, когда глядя на свой код, он будет казаться страшным, а размер его устрашающим - не обвиняйте меня.

Уважаемые Читатели - не забывайте, что хабраюзер, просто перевел (паршиво, да) текст. Идеологических претензий ему высказывать нет нужды.

Ruby — один из самых молодых языков программирования. Его создатель Юкихиро Мацумото (Yukihiro Matsumoto, также известный под псевдонимом Matz), профессиональный японский программист, рассказывает: <<Я начал разработку Ruby 24 февраля 1993 года. Первая hello world программа на Ruby заработала летом того же года, а aльфа-версия была готова к декабрю 1994.>> Название языка происходит от имени драгоценного камня рубина (по аналогии с другим широко распространенным языком программирования Perl: pearl — жемчуг).

Вот как характеризует Ruby его автор: <<Это мощный и динамический объектно-ориентированный язык с открытыми исходниками. Ruby работает на многих платформах, включая Linux и другие реализации Unix, MS-DOS, Windows 9x/2000/NT, BeOS и MacOS. Главная цель Ruby — эффективность разработки программ, и пользователи найдут, что программирование на нем эффективно и даже забавно>> .

В Японии Ruby стал популярным с момента появления первой общедоступной версии в 1995 году, однако наличие документации только на японском языке сдерживало его дальнейшее распространение. Лишь в 1997 году появилось описание Ruby на английском языке, а в 1998 году открылся форум ruby-talk. С этого момента Ruby начал свое шествие по всему миру. За последний год появились три англоязычные книги, посвященные ему (см. ), хотя на русский язык, к сожалению, ни одна из них еще не переведена. Сейчас Ruby входит в большинство дистрибутивов ОС Linux, доступен он и пользователям других операционных систем.

Заметим, что данная статья не является справочным руководством по языку. С кратким введением можно познакомиться в электронном учебнике , а более полная информация может быть найдена в и , а также на уже упомянутых выше сайтах сети интернет. Основная цель статьи — дать людям, уже знакомым с различными языками программирования, общее представление об особенностях Ruby, показать его мощь и красоту, объяснить, что он одинаково хорош и как первый язык программирования, и как средство для работы профессионального программиста и системного администратора.

Программисты говорят о Ruby

В этом разделе мы изложим собранные из различных источников высказывания о языке Ruby, отложив на некоторое время рассмотрение примеров, иллюстрирующих их. Большая часть вопросов, которые будут затронуты, предполагает наличие определенных знаний у читателя в области теории языков и объектно-ориентированного программирования. Легче всего понять Ruby тем, кто знает Smalltalk, Lisp, C, C++ и Perl. <<Джентльменский>> набор из Perl, Java и C++ тоже является весьма хорошей стартовой позицией для изучения Ruby.

Тем же, кто не может похвастаться подобными знаниями, весьма приятно будет узнать, что

* <<если для изучения языка Perl Вам нужно потратить, скажем, три недели, то Python Вы изучите за неделю, а Ruby — за один день!>>

* <>.

Во введении мы уже цитировали Юкихиро Мацумото — создателя Ruby. Вот что еще он сам говорит об этом языке. Итак, Ruby

* имеет простой синтаксис;

* поддерживает обработку исключений;

* позволяет переопределять операторы;

* является чисто объектно-ориентированным языком (complete, full, pure object oriented language), в котором, в отличие от Java или Perl, все — объекты;

* позволяет работать с целыми числами произвольной величины;

* не требует объявления переменных;

* использует префиксы (@, $, @@) для задания области видимости (scope) переменных;

* поддерживает многопоточное программирование.

Одной из первых работ, привлекших внимание к Ruby, была уже несколько устаревшая статья Хала Фултона (Hal Fulton) <<Тридцать семь причин, по которым мне нравится Ruby>>. Вот некоторые из них.

Ruby является динамическим языком. В отличие от статических языков, подобных C++ или Java, методы и переменные в Ruby могут быть добавлены или переопределены во время выполнения программы. Это позволяет, например, обойтись без директив условной компиляции #ifdef, необходимых для языка C. Здесь проявляется сходство Ruby с такими языками, как Lisp и Smalltalk.

Ruby — интерпретируемый язык. Так как это свойство отрицательно сказывается на производительности, то хочется дать некоторые комментарии. Во-первых (и это самое главное), быстрый цикл разработки является важнейшим достоинством, которое <<перевешивает>> некоторые недостатки. Во-вторых, хотя Ruby и не является катастрофически медленным, в тех случаях, когда скорость абсолютно необходима, можно написать часть кода на языке C. Наконец, в-третьих, никто не сказал, что когда-нибудь не будет написан компилятор с языка Ruby.

В Ruby имеется возможность работы с регулярными выражениями. Когда-то они использовались только в некоторых утилитах UNIX-систем (grep, sed, vi). Затем, благодаря языку Perl, значительное число людей признало их мощь при обработке текстов. Ruby дает возможность использовать эту силу с еще большей легкостью.

Помните известную фразу Исаака Ньютона <<Если я видел дальше, чем другие, то только потому, что стоял на плечах гигантов>>? Ruby, безусловно, <<стоит на плечах гигантов>>, среди которых Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell и другие языки. В Ruby собрано все лучшее, что накоплено человечеством в области языков программирования. При этом соблюдены следующие три принципа: не изобретать колесо, не чинить не сломанное, использовать имеющиеся у программистов знания и опыт. В Ruby пригодятся и знания о файлах и потоках из ОС UNIX, и спецификации функции printf из стандартной библиотеки ввода/вывода языка C, и умение работать с регулярными выражениями в Perl.

Ruby — язык написания сценариев (scripting language). Не следует считать, что это характеризует язык, как <<игрушечный>> или недостаточно мощный. Подобный язык должен быть интерпретируемым и способным заменить командные файлы, взаимодействующие с операционной системой и управляющие поведением других программ.

Ruby — универсальный и гибкий язык. С его помощью можно одинаково изящно реализовать как то, что традиционно делается с помощью интерпретатора Kornshell, так и то, что пишется обычно на C.

По простоте и богатству возможностей работы со строками и массивами языку Ruby нет конкурентов. Массивы являются динамическими, с ними можно оперировать как с множествами, стеками и очередями. Есть и ассоциативные массивы, работа с которыми также чрезвычайно проста и удобна.

Для языка Ruby уже написано большое число библиотек. Потоки, сокеты, объекты, сохраняемые между запусками программ, CGI-программы, базы данных, GUI — все это можно использовать, программируя на Ruby.

Дэйв Томас (Dave Thomas) и Энди Хант (Andy Hunt), соавторы первой книги по Ruby, вышедшей на английском языке, в интервью журналу «Dr. Dobb’s Journal» (январь 2001) говорят: <<Возьмите чисто объектно-ориентированный язык Smalltalk и избавьтесь от его причудливого синтаксиса. Добавьте комфорт и мощь языка Perl, но без всяких специальных случаев и магических преобразований. Заверните получившееся в ясный синтаксис, основанный частично на языке Eiffel, и добавьте понемногу от Scheme, CLU, Sather и Common Lisp. У вас получится Ruby.>> Фактически это означает, что Ruby — естественный и практически неизбежный результат эволюции современных языков программирования. Авторы данной статьи согласны с такой точкой зрения.

Хочется подчеркнуть, что Ruby не является панацеей для решения всех проблем программистов. Не следует отказываться от использования языков Java и C++ там, где их применение оправдано. С другой стороны, не разумно недооценивать возможности практического применения Ruby в реальных проектах.

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

Начнем с языка Java:

* Ruby — интерпретируемый язык;
* в Ruby все является объектом (в Java есть типы int и Integer, что создает определенные неудобства);
* переменные в Ruby не являются статически типизированными и не требуют объявления;
* модули (modules) в Ruby позволяют с помощью <<миксинов>> (mixins) конструировать подобие интерфейсов (interfaces) языка Java, допуская при этом в них реализацию методов.

Теперь сравним с языком Perl:

* Ruby значительно легче освоить, на нем легче программировать, а написанные программы проще сопровождать;
* в Ruby префиксы (@, $, @@) описывают область видимости (scope), а не тип переменной;
* Ruby позаимствовал из языка Perl регулярные выражения, переменную $_ и многое другое.

Завершим сопоставление Ruby с другими языками рассмотрением одного из ближайших <<конкурентов>> — языка Python. Это сравнение особенно интересно потому, что именно Python рассматривается сейчас многими, как хороший кандидат на роль первого языка программирования. Итак, сравним Ruby с языком Python:

* управляющие конструкции и методы в языке Ruby завершаются ключевым словом end, в то время как Python использует так называемый <<двумерный>> синтаксис, когда признаком завершения является изменение количества лидирующих пробелов в очередной строке программы;
* вместо self в Ruby для обозначения переменных экземпляра используется префикс @;
* в Ruby, в отличие от языка Python, понятия типа и класса являются синонимами;
* Python не поддерживает наследования и не позволяет добавлять методы к существующим типам;
* используемый в Ruby алгоритм сборки мусора позволяет проще писать реализации методов на языке C;
* расширения для Ruby, написанные на C/C++ позволяют определять новые классы;
* зачастую Ruby быстрее, чем Python.

И вновь дадим слово создателю языка. Его высказывание о планах дальнейшей работы над Ruby, выраженное в виде одной из управляющих конструкций языка, позволит нам плавно перейти к рассмотрению примеров реальных программ.

loop do read and reply mails write code write document/article/book write code end

Программисты пишут на Ruby

Начнем с примеров, показывающих, что знание библиотек ввода/вывода языков C и C++ пригодится и в Ruby.

printf "Число: %5.2f; Строка: %s", 1.23, "Привет!" endl = "n"; $stdout << 17 << " красных шариков" << endl line = gets; print line

Специальная глобальная переменная $_ всегда содержит результат последней операции чтения. Она же используется как аргумент по умолчанию во многих конструкциях. Следующая программа, например, печатает все строки из входного потока, которые содержат слово Ruby.

while gets # присваивание очередной строки переменной $_ if /Ruby/ # сопоставление ее с образцом Ruby print # печать $_ end end

ARGF.each { |line| print line if line =~ /Ruby/ }

ARGF в Ruby — это объект, который представляет собой конкатенацию содержимого всех файлов, имена которых заданы в командной строке, либо просто стандартный поток ввода (в случае отсутствия аргументов).

Вот как выглядит на Ruby программа вычисления факториала числа, указываемого в качестве аргумента командной строки:

def fact(n) return 1 if n == 0 f = 1 while n>0 f *= n n -= 1 end return f end print fact(ARGV.to_i), "n"

Для вычисления с помощью этой программы, размещенной в файле fact.rb, значения 100! достаточно выполнить команду ruby fact.rb 100.

Три программы, рекурсивно вычисляющие 30-е число Фибоначчи, приведенные ниже, позволяют сравнить производительность интерпретаторов Ruby, Python и Perl.

# Ruby def fib(n) if n<2 n else fib(n-2)+fib(n-1) end end print fib(30), "n" # Python def fib(n): if n<2: return n else: return fib(n-2)+fib(n-1) print fib(30) # Perl sub fib { my($n)=@_; if ($n<2) { return $n; } else { return fib($n-2)+fib($n-1); } } print fib(30), "n";

Еще одна классическая задача — определение с помощью решета Эратосфена списка всех простых чисел, не превосходящих заданного (100 по умолчанию).

max = Integer(ARGV.shift || 100) sieve = for i in 2 .. max sieve[i] = i end for i in 2 .. Math.sqrt(max) next unless sieve[i] (i*i).step(max, i) do |j| sieve[j] = nil end end puts sieve.compact.join ", "

В качестве следующего примера рассмотрим решение на языке Ruby задачи, которая часто предлагается студентам первого курса, изучающим языки C/C++: для заданного текстового файла определить число вхождений в него каждого из встречающихся в нем слов. Использование ассоциативных массивов и ряда стандартных методов работы с файлами и строками позволяет написать чрезвычайно краткую и ясную программу.

freq = Hash.new(0) while gets() for word in $_.split(/W+/) freq += 1 end end for word in freq.keys.sort! print word, " -- ", freq, "n" end

Приведем два простых примера использования стандартной библиотеки классов. В результате выполнения первой программы будет найдено, что 7/8+1/8=1, а 7/8*1/8=7/64; вторая из них вычислит (1 + i)64.

require "rational" a = Rational(7,8) b = Rational(1,8) print a, "+", b, "=", a+b, "; ", a, "*", b, "=", a*b, "n" require "complex" a = Complex(1,1); print a**64

Без подробных объяснений приведем две эквивалентные программы, иллюстрирующие переопределение оператора для класса SongList. Ассоциативный массив (associative array, hash или dictionary) допускает индексирование произвольными объектами, а не только целыми числами. В данном случае оператор позволяет находить нужную песню не только по номеру, но и по ее названию.

class SongList def (key) if key.kind_of?(Integer) return @songs else for i in [email protected] return @songs[i] if key == @songs[i].name end end return nil end end class SongList def (key) return @songs if key.kind_of?(Integer) return @songs.find { |aSong| aSong.name == key } end end

Так как Ruby унаследовал лучшие особенности многих языков, то для выполнения достаточно стандартных действий обычно имеется несколько разных возможностей. Вот 13 (!) различных способов напечатать числа от 0 до 9:

i = 0 i = 0 while i < 10 begin print i , " " print i , " " i += 1 i += 1 end end while i < 10 i = 0 i = 0 until i >= 10 begin print i , " " print i, " " i += 1 i += 1 end end until i >= 10 for i in for i in (0..9) print i, " " print i, " " end end for i in (0...10) 10.times do |i| print i, " " print i, " " end end 0.upto(9) do |i| 9.downto(0) do |i| print i, " " print i, " " end end (0..9).each do |i| (0...10).each do |i| print i, " " print i, " " end end i = 0 loop do if i < 10 then print i, " " else break end i += 1 end

В заключение вопрос для тех, кто не знает языка Ruby: что напечатает следующая программа?

print ["L", "R", "H", "T"].collect { |x| x.succ }

Если вы сумеете угадать ответ, то это будет лучшим подтверждением тому факту, что Ruby интуитивно ясный язык. Если же не угадаете, то у вас будет еще одна причина изучить его.

Ruby и новички

Этот язык, несомненно, является одним из лучших в качестве первого языка программирования. Быстрый цикл разработки (редактирование — запуск — редактирование), использование интерпретатора, изначальная объектно-ориентированность, нетипизированные переменные, которые не требуют объявления, — все это позволяет учащимся сконцентрировать свое внимание на общих принципах программирования.

Не менее важны мультиплатформенность Ruby и его принадлежность к миру свободно распространяемого ПО. Еще один весомый аргумент в его пользу — возможность практического использования языка в самых разных областях, что не позволит впоследствии профессионалу, который вырастет из новичка, пожалеть о напрасно потраченном времени.

Можно заметить, что значительному числу перечисленных выше требований удовлетворяют и Python, и Java, и C++ и даже (в меньшей степени) Delphi. Последний из них, правда, является коммерческим продуктом, что автоматически должно было бы повлечь исключение его из рассмотрения. Однако в России даже среди организаторов олимпиад по программированию для школьников находятся люди, утверждающие, что стоимость дистрибутива Delphi составляет около 70 рублей!

Попробуем сначала сравнить языки Ruby и Java, посмотрев на них глазами человека, только начинающего знакомиться с миром программирования. Для такого человека чрезвычайно важна ясность и краткость программ, отсутствие в них странных и непонятных <<магических>> слов. А именно из них и состоит в основном Java-вариант традиционной первой программы!

public class Hello { public static void main(String args) { System.out.println("Здравствуй, мир!"); } }

Аналогичную программу на Ruby долго объяснять не придется:

puts "Здравствуй, мир!"

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

В отличие от языка Java в Ruby нет проблемы <<больших>> чисел. Приведенные выше программы вычисления факториала числа или чисел Фибоначчи, будучи написанными на Ruby, всегда дают верный результат. В случае же языка Java ограничения на диапазон представимых целых чисел приводят к нелепым (с точки зрения ученика школы или студента первого курса) равенствам типа

Неприятная неожиданность для человека, только приступающего к изучению программирования!

Еще одним важным фактором является простота методов, используемых в Ruby для ввода данных с клавиатуры или из файла. В случае языка Java сложность этих операций приходится тщательно маскировать, ограждая новичка от ненужных ему проблем.

Компактность дистрибутива Ruby и простота его установки в любой операционной системе позволяют школьнику или студенту без проблем работать на домашнем компьютере. Опять сравнение не в пользу Java!

Язык Python по многим параметрам похож на Ruby. Из приведенных выше различий этих двух языков для рассматриваемой нами ситуации начального обучения программированию особенно значимым оказывается <<двумерный>> синтаксис, используемый в языке Python. Эта особенность не является изначально понятной и на первых порах мешает. Вообще, основным аргументом в пользу Ruby в качестве первого языка программирования является именно его интуитивная ясность и предсказуемость, а не многие другие его преимущества.

Ruby и профессионалы

Чем же хорош Ruby для профессионального программиста и системного администратора? Многое уже было сказано выше, но вот еще несколько интересных примеров и кратких комментариев.

По умолчанию строка, заключенная в обратные апострофы, заменяется результатом выполнения команды, в ней заданной. Можно, однако, и переопределить это поведение:

alias oldBackquote ` def `(cmd) result = oldBackquote(cmd) if $? != 0 raise "Command #{cmd} failed" end result end print `date` print `data`

CGI-скрипты, формы, работа с <<ключиками>> (cookies) — это только начало. Программы на Ruby могут быть внедрены прямо в HTML, что эквивалентно использованию таких средств, как ASP, JSP или PHP. При этом сохраняется вся мощь Ruby, а для повышения производительности можно использовать специальный модуль для Apache.

eruby example

Enumeration

    <%(1..10).each do|i|%>
  • number <%=i%>
  • <%end%>

Environment variables

<%ENV.keys.sort.each do |key|%> <%end%>
<%=key%><%=ENV%>

Ниже приведена программа, иллюстрирующая Tk расширение языка Ruby. Левая кнопка мыши позволяет рисовать прямые линии, а правая — создавать Postscript-файл с построенным изображением.

require "tk" class Draw def do_press(x, y) @start_x = x @start_y = y @current_line = TkcLine.new(@canvas, x, y, x, y) end def do_motion(x, y) if @current_line @current_line.coords @start_x, @start_y, x, y end end def do_release(x, y) if @current_line @current_line.coords @start_x, @start_y, x, y @current_line.fill "black" @current_line = nil end end def initialize(parent) @canvas = TkCanvas.new(parent) @canvas.pack @start_x = @start_y = 0 @canvas.bind("1", proc{|e| do_press(e.x, e.y)}) @canvas.bind("2", proc{ puts @canvas.postscript({}) }) @canvas.bind("B1-Motion", proc{|x, y| do_motion(x, y)}, "%x %y") @canvas.bind("ButtonRelease-1", proc{|x, y| do_release (x, y)}, "%x %y") end end root = TkRoot.new{ title "Canvas" } Draw.new(root) Tk.mainloop

Отметим, наконец, что конфигурация и установка дистрибутива Ruby осуществляется с помощью скриптов, написанных на нем самом.

Заключение

Выпускники МГИУ специальности 2204 этого и предыдущего годов (многие из которых являются сейчас аспирантами) могут обнаружить, что язык Ruby во многом похож на известный им по занятиям на первом курсе язык C-Talk. Этот язык, который разрабатывался в нашем университете группой программистов под руководством Игоря Вячеславовича Абрамова (см. ), был основан в значительной мере на тех же самых идеях, которые взяты в качестве основополагающих автором Ruby.

Сегодня мне в асю кинули вот такой вот материал для размышления. К сожалению в Yandex"е я так и не смог найти сайт с оригиналом текста, но все же вот этот текст…

  • Перевод

Я познакомился с Ruby сравнительно недавно, благодаря чудесному фреймворку Ruby on Rails . Я не считаю себя экспертом в Ruby, но я прочитал PickAxe, написал несколько утилит на Ruby для личного пользования, а также разрабатываю на Rails в свободное время.

Ruby на данный момент, мой основной язык. Начинал же я с TurboPascal в школе, изучал C и C++ в университете, дисертацию писал на Java , а еще я изучал PHP с нуля, так как хотел научиться делать веб-сайты быстро и легко. Думаю, что написание кода для меня это некая форма развлечения, а уж потом все остальное. В начале у меня были размышления, какой язык изучать, Python или Ruby. Я выбрал второй, так как не хотел, чтоб неправильные отступы были причиной неполадок в моем коде.

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

Это более скромный, неполный перечень причин, которые могут (или не могут) побудить вас использовать Ruby, ну или в крайнем случае поиграть с ним. Предостережение: если вы используете другой язык программирования для работы или в других целях - не жалуйтесь мне, если больше не захотите им пользоваться. Именно это и произошло со мной, но для меня это не столь важно. Ruby чудесный и элегантный язык и как многие подобные вещи, он может захватить ваш разум и поломать душу.

Короче, вы - предупреждены.

Зачем изучать Ruby?

1.Вы получаете все удобства (удовольствия) без уловок.

Ruby позаимствовал все лучшее из других языков программирования, от smalltalk до Java , от Perl до Python . Вот базовые возможности, которые вы в принципе могли видеть и в других языках:
  • Исключения. Верите или нет, исключения являются одной из важнейших вещей при разработке программ любого рода. Программисты на PHP4 , не знают ничего о них и будут говорить вам, что можно просто печатать(ошибки) на экран или использовать их собственный «супер-пупер» класс для обслуживания ошибок. К счастью для всех нас, Ruby поставляется с try/catch (или еще лучше begin/rescue ) блоками и набором предопределенных, расширяемых Исключений, для правильной обработки ошибок.
  • Пространства имен: модули Ruby делают использование пространства имен легким, это должно понравиться энтузиастам C++ и Java .
  • Встроенные регулярные веражения: Для всех знатоков Perl , вы можете заключить нечто в // и оно становится регулярным выражение, готовым для сравнения (для этого используем оператор =~ ).
  • Перегрузка операторов: Ruby позволяет определять операторы, такие как +, -, > , и т.д. для любого вашего класса.
  • Пакеты: называемые «gems »(камешки), они действительно оправдывают свое название, кроме того - они работают. Пакеты поддерживают зависимости, а еще могут быть как кросс-платформенные, так и платформо-зависимыми.
  • Интерактивная консоль: может использоваться для тестирования кода интерактивно, подобно консоли Python

2.Вы полюбите мелочи.

Ruby изящен. Почему? Потому-что он не старается делать код лаконичным настолько, что б это мешало читабельности и пониманию. Есть несколько советов, которые могут вам помочь:
  • Вы можите использовать оба оператора, if и unless в условных выражениях. Кончно же вы можите использовать if с противоположным значением выражения, но использования unless обычно приводит к меньшему числу ошибок. Кроме того, вы можите использовать оба оператора, как условные модификаторы, ставя их после выражения, а не до: order.new unless order.exists
  • Можно использовать знаки вопроса и восклицания в конце имени метода. Данное соглашение не навязывается, но знак «? » используется, когда метод возвращает true или false , в то время, как знак «! » используется для методов, делающих нечто необратимое, на подобии удаления записи из базы данных, отщепления последнего символа из строки и т.п.
  • Можно использовать псевдонимы (alias ) для уже созданных методов. Таким образом можно получить методы exist и exists , без накладных расходов и без повторений.
  • Вы можете использовать директивы attr_reader , attr_writer или attr_accessor для автоматического создания getter/setteer для членов класса.
  • И еще некоторое соглашение об именах: константы, классы и модули пишут с заглавной буквы, методы и члены класса должны начинатся с маленькой буквы, глобальные переменные именуют начиная с «$ », имена переменных объекта начинаются с «@ », а имена переменных класса с «@@ », ну и т.д.
  • При вызове методов, можно не писать скобки. Можно писать write File.open("/home/h3rald/test.txt") или просто File.open "/home/h3rald/test.txt" , что особенно удобно с методами, без аргументов.

3.Больше не нужно использовать точку с запятой.

Хотите написать следаующую инструкцию? Просто переходите на новую строку. Нажмите «Enter » и готово. В Ruby как и в Python , новая линия разделяет инструкции, так что вам не придется все время ставить точку с запятой. К сожалению это означает, что подобно фанатам C++ , мы не сможем написать программу в одну строчку. Но это не так уж и плохо, правда?

4.Все является объектом, как это и должно быть.

Когда я изучал Java , мне говорили, что все является объектом.
- «Че, 14 и 374346.678 - объекты?»
- «Нет, глупыш, это числа!»

В Ruby числа, символы, булевы значения и все остальное является объектом. Серьезно. Это означает, что можно писать вещи подобно этим:
"YOU SHOULDN"T ALWAYS USE CAPITALS".lowcase # вернет "you shouldn"t always use capitals" , вместо нечто такого:
# PHP Code
strtolower("YOU SHOULDN"T ALWAYS USE CAPITALS")
Этим вы экономите время, экономите скобки и так более логично.

5.Все имеет значение.

Или «больше не надо использовать return для возврата значений». Если побыстрячку, то так: все инструкции в Ruby возвращают значение, даже присваивание переменных, так что вам действительно не нужно использовать ключевое слово «return » в конце методов. Значение последнего присваивания всегда будет возвращено.

6.Можете изменять окружение любым доступным способом.

Впервые увидев это, я был впечатлен. Представьте типичную ситуацию: вы стали использовать системный класс или класс, написаный кем-то другим и поняли, что вам надо некий дополнительный метод в нем. Есть несколько путей для решения этой проблемы в типичных языках программирования:
  • Вы изменяете исходный код класса, если вы имеете к нему доступ. Но обычно это - плохая идея, не делайте так.
  • Вы наследуете свой класс от того и добавляете к нему новый метод. Обычно это - хорошая идея. Но из-за одного метода это может оказаться несколько монрообразным. Кроме того, придется немного подправить другой свой код соответственно.
  • Можно просто создать метод вне класса. Это сработает, но будет не очень изящно, а еще - идет в разрез с ООП .
В Ruby вы можете добавить метод в оригинальный класс, без правки исходных кодов. Это можно сделать даже для системного класса.
Мы хотим добавить метод, для пересчета значений из метров в футы? Просто расширим класс Numeric , как показано:
class Numeric
def feet
self*3.2808399
end
end

С этого момента, все наши числа, будут иметь новый метод, который может использоваться, как любой другой:
5.feet # возвратит 16.4041995
Классы в Ruby никогда не закрываются и могут быть расширены в любой момент, из любого места. Естественно использовать такую возможность надо с осторожностью!

7.Вы не сможите получать единорогов из птиц и конец, но вы получите ослов, если захотите.

Я четко помню, как моя учительница по C++ , использовала животных, для иллюстрации основных концепций объектно-ориентированного программирования - классов и наследования. Было нечто загадачно, когда объясняла нам множественное наследование, образовывая «пегаса» из «птиц» и «лошадей». Сумасшедшие вещи, Ruby не позволяет множественного наследования. Это выглядит как тренд и в конце-концов это дело вкуса. Я не в восторге от множественного наследования, так как это может привести к непредсказуемым вещам. Несмотря на это есть возможность создания нечто подобного, используя модули Ruby , так что переменные и методы одного модуля, будут добавлены в определенный класс, если модуль включен в него.

8. XML - реально ненужен.

XML - красивый, общеупотребительный, язык разметки, который может быть обработан всеми языками программирования и используется повсеместно. К сожалению, он слишком громоздкий для написания, трудный для обработки(парсинга) и, давайте будем честны - трудный для чтения в большинстве случаев. А вот взгляните на следующий фрагмент:
regexp: !ruby/regexp /a-zA-Z/
number: 4.
string: a string

Безусловно это легче и проще XML , правда? Добро похаловать в YAML , любимый (но не единственный) язык разметки Ruby , с помошью которого любой объект может быть представлен в простом, лаконичном, но полном виде.
Ruby способен работать с XML , но простота YAML подкупила многих разработчиков, которые теперь используют его вместо XML , например для файлов конфигурации (так поступили в Rails ). Фрагмент, представленный выше, был получен исполнением следующего фрагмента кода:
{"string" => "a string", "number" => 4.7, "regexp" => /a-zA-Z/}.to_yaml
Метод to_yaml , определен для класса Object , который является родителем для всех остальных объектов, а потому доступен для всех объектов Ruby . Это позволяет преобразовывать объекты в YAML и обратно, абсолютно прозрачно для разработчика. Круто, да?

9.Лямбда - нечто больше, чем просто греческая буковка.

Ruby позаимствовал некую магию из Lisp и Perl в объекты и блоки 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

Можно было использовать ключевое слово lambda вместо Proc.new , на результат это не влияет. Это могло показаться знакомым людям, знающим Perl и Python (или Lisp ). Такое можно сдалать даже на PHP , но не много людей пользуются этой возможностью.
Кроме того в Ruby широко используются блоки типа «несозданные Proc », например, для итерации по содержимому объекта и исполнения некоторого кода, подобно методу each , доступного для класса Array :
.each {|c| puts c*2} #=> возвратит каждый элемент, умноженный на 2
Если код не умещается на одной строчке, рекомендуется использовать конструкцию do… end , вместо использования скобок. Фаны Ruby не любят скобок.

10. Вы можете использовать Rails.

Последнее, но не по важности… Вы всегда можете использовать Rails для разработки веб-приложений. Разработка будет не настолько простой, как с PHP , но Rails были написаны на Ruby , поскольку он имет возможности, отсутствующие в других языках.

Заключение

Время вышло. Возможно вы уже задумываетесь о взгляде на Ruby , возможно вы уже пробовали его, а возможно вы просто проигнорировали его. Как бы там нибыло, в следующий раз, когда глядя на свой код, он будет казаться страшным, а размер его устрашающим - не обвиняйте меня.

Уважаемые Читатели - не забывайте, что хабраюзер, просто перевел (паршиво, да) текст. Идеологических претензий ему высказывать нет нужды.

Введение

Сегодня поисковая система - один из самых широко используемых методов навигации в киберпространстве, которое растёт и увеличивается с каждым днём своего существования. Понятно, что и алгоритмы поиска информации должны постоянно увеличивать свою сложность и эффективность. Целью даной работы не является описание алгоритмов поиска информации, а просто дать ознакомительное их описание. Также целью данной работы является написание поисково веб-приложения на языке программирования Ruby.

С учётом вышеизложенного можно сформировать следующие цели:

Ознакомление с алгоритмами поиска информации

Написание поискового веб-приложения

Поставленные цели осуществляется с помощью задач:

Изучение теории поиска

Изучение языка программирования Ruby

Ознакомление с языком разметки Haml

Ознакомление с метаязыком Sass

Используя Ruby,Haml и Sass, написать код веб-приложения

Произвести отладку получившегося приложения

Теоретическая часть

Теория поиска информации

Для начала необходимо дать определение поисковой системы.

Поисковая система – программно-аппаратный комплекс с веб-интерфейсом, предоставляющий возможность поиска информации в интернете .

По осуществляемым функциям и решаемым задачам поисковые системы классифицируются на:

справочные являются наиболее распространенным типом функций информационных систем, и заключается в предоставлении абонентам системы возможностей получения установочных данных на определённые классы объектов;

поисковые являются наиболее распространённым классом информационных систем. В общем, виде можно рассматривать, как некоторое информационное пространство, задаваемое в терминах информационно-логического описания предметной области);

расчётные. Функция системы заключается в обработке информации, находящейся в системе, по определённым расчётным алгоритмам для различных целей.

По характеру же предоставления логической организации хранимой информации поисковые системы разделяются на фактографические, документальные и геоинформационные.

Так фактографические поисковые системы накапливают и хранят данные в виде множества экземпляров одного или нескольких типов структурных элементов. Каждый из таких экземпляров структурных элементов или некоторая их совокупность отражают сведения, по какому - либо факту, событию. Структура каждого типа информационного объекта состоит из конечного набора реквизитов, отражающих основные аспекты и характеристики сведений для объектов данной предметной области.

В документальных поисковых систем единичным элементом информации является нерасчлененный на более мелкие элементы документ, и информация при вводе, как правило, не структурируются, или структурируются в ограниченном виде. Для вводимого документа могут устанавливаться некоторые формализованные позиции - дата изготовления, исполнитель, тематика. Некоторые виды документальных информационных систем обеспечивают установление логической взаимосвязи вводимых документов - соподчиненность по смысловому содержанию.

В геоинформационных данные организованы в виде отдельных информационных объектов привязанных к общей электронной топографической основе. Геоинформационные системы применяются для информационного обеспечения в тех предметных областях, структура информационных объектов и процессов в которых имеется географический компонент.

Также существует следующая классификация поисковых систем (рис.1.)

Рис.1. Классификация поисковых систем

Говоря о поисковых системах, стоит упомянуть теорию поисковых запросов и их классификацию. Так в 1949 году профессором филологии из Гарварда были описаны некоторые из особенностей поиска информации.

Профессор Зипф заметил, что длинные слова встречаются в текстах любого языка реже, чем короткие. На основе этого наблюдения Зипф вывел два закона:

Первый закон связывает частоту появления (вхождения) того или иного слова с рангом этой частоты. Наиболее часто встречающимся словам присваивается ранг, равный единице. Тем словам, что встречаются реже – ранг, равный двойке и т.п. Зипф обнаружил, что произведение частоты вхождения слова и его ранга является постоянной величиной.

Такая зависимость обычно отображается гиперболой. Значение константы Зипфа для разных языков различно, но внутри одной языковой группы оно остается неизменным. Для русского языка константа равна примерно 0,06-0,07.

Зипф определил, что частота вхождения слов и количество слов, входящих в текст с данной частотой, тоже взаимосвязаны.

С одной стороны получившая кривая будет сохранять свои параметры для всех текстов в пределах одного языка. С другой стороны, на каком бы языке текст ни был написан, форма кривой Зипфа останется неизменной. Отличаться будут лишь коэффициенты.

Законы Зипфа универсальны. Они применимы не только к текстам. В аналогичную форму выливается, например, зависимость между количеством городов и числом проживающих в них жителей. Характеристики популярности ресурсов интернета отвечают законам Зипфа. В законах Зипфа отражается «человеческое» происхождение объектов.

В любом случае каждый поисковый запрос можно классифицировать по трём характеристикам: длина запроса, чёткость запроса, стадия поиска.

Так по длине все запросы делятся на

Однословные(«продвижение»)

Двухсловные(«поисковое продвижение»

Трёхсловные(«профессиональное поисковое продвижение»)

Многословные(«профессиональное поисковое продвижение недорого»)

По чёткости все запросы делятся на:

Чёткий запрос(«цена на iPad 2»)

Нечёткий запрос(«Озон», что может быть и газом и названием магазина и фамилией режиссёра)

По стадии поиска все запросы делятся на:

Осознание проблемы(«не работает сайт»)

Поиск решения(«хостинг сайтов»)

Выбор решения(«какой хостинг выбрать»)

Поиск места транзакции(«тарифы хостинга masterhost»)

Язык программирования RUBY

Ruby – динамический, рефлективный, интерпретируемый высокоуровневый язык программирования для быстрого и удобного объектно-ориентированного программирования. Язык обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, сборщиком мусора и многими другими возможностями. Ruby близок по особенностям синтаксиса к языкам Perl и Eiffel, по объектно-ориентированному подходу - к Smalltalk. Также некоторые черты языка взяты из Python, Lisp, Dylan и Клу. На сегодняшний день интерпретатор Ruby реализован практически для всех платформ(Unix, Win32, OS X). Создателем языка является Юкихиро Мацумото.

Ruby – полностью объектно-ориентированный язык программирования. Всё является объектами, а функции - методами этих объектов .

Основные свойства Ruby:

Интерпретируемый язык:

Возможность прямых системных вызовов.

Мощная поддержка операций со строками и правилами (регулярными выражениями).

Мгновенное проявление изменений во время разработки.

Отсутствие стадии компиляции.

Простое и быстрое программирование:

Не надо объявлять переменные.

Переменные динамически типизированы.

Простой и последовательный синтаксис.

Автоматическое управление оперативной памятью.

Объектно-ориентированное программирование:

Всё есть объект. Даже имя класса есть экземпляр класса Class.

Классы, методы, наследование, полиморфизм, инкапсуляция и так далее.

Методы-одиночки.

Примеси при помощи модулей (возможность расширить класс без наследования);

Итераторы и замыкания.

Широкие возможности метапрограммирования.

Удобства:

Неограниченный диапазон значений целых чисел.

Модель обработки исключений.

Все операторы возвращают значения, даже управляющие структуры.

Механизм перехвата исключений.

Поддержка потоков; как собственных, так и систем семейства UNIX.

Недостатки:

Неуправляемость некоторых процессов (таких, как выделение памяти), невозможность задания низкоуровневых структур данных или подпрограмм;

Невозможность компиляции и сопутствующей ей оптимизации программы;

Открытость исходного кода даже в готовой программе

Следствие двух первых недостатков - весьма низкая скорость запуска и выполнения программ .

Также стоит отметить, что для Ruby существует множество модулей (дополнений) практически для любого вида задач (программирование интерфейсов, сложные математические вычисления, работа с аудио, видео, 3D и т.п). Поэтому этот язык программирования был выбран в качестве основного для написания практической части.

1.3. Язык упрощённой разметки HAML

Haml - язык разметки для упрощённой генерации XHTML. HAML компилируется в HTML. Haml намного проще Html"`а так, как позволяет упростить и ускорить написание веб-приложений.

Например, данный кусок кода на Haml"е

%html{ html_attrs("ru") }

%title Мой блог

%meta(http-equiv="Content-Type" content="text/html; charset=utf-8")

Stylesheet_link_tag "main"

%h1 Мой блог

%h2 Записи

- @entries.each do |entry|

%h3.title= entry.title

%p.date= entry.posted.strftime("%A, %B %d, %Y")

%p.body= entry.body

Все права защищены © Иван

Трансформируется Html-код

Мой блог