<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF89%3A%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5</id>
		<title>LXF89:Нестандартное программирование - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF89%3A%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;action=history"/>
		<updated>2026-05-13T08:44:20Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=9788&amp;oldid=prev</id>
		<title>Yaleks: /* Мысли напоследок */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=9788&amp;oldid=prev"/>
				<updated>2010-03-01T14:40:47Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Мысли напоследок&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 14:40, 1 марта 2010&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 205:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 205:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вот сервер и готов. Удивительно просто, правда? Конечно, пока он обрабатывает только HTML-файлы — но были бы кости, мясо нарастет. Главное, что это пример применения Ruby в реальной задаче, и по нему видно, что код получается чудесно-простой и легко читаемый.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вот сервер и готов. Удивительно просто, правда? Конечно, пока он обрабатывает только HTML-файлы — но были бы кости, мясо нарастет. Главное, что это пример применения Ruby в реальной задаче, и по нему видно, что код получается чудесно-простой и легко читаемый.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В Ruby еще много чего можно исследовать, и так как Ruby on Rails продолжает набирать популярность, вы об этом языке, несомненно, еще услышите. Ясный и разумный синтаксис Ruby лучше всех прочих поможет разобраться с объектно-ориентированным программированием тем, кто привык к С или Basic. Внизу слева находится врезка «Ссылки», там вы найдете и учебники, и прочую информацию. А напишете нечто крутое — сообщите нам на форум http://&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;www&lt;/del&gt;.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;linuxforum.ru&lt;/del&gt;. Как знать, может, вашей будущей программы не хватает на нашем DVD…&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В Ruby еще много чего можно исследовать, и так как Ruby on Rails продолжает набирать популярность, вы об этом языке, несомненно, еще услышите. Ясный и разумный синтаксис Ruby лучше всех прочих поможет разобраться с объектно-ориентированным программированием тем, кто привык к С или Basic. Внизу слева находится врезка «Ссылки», там вы найдете и учебники, и прочую информацию. А напишете нечто крутое — сообщите нам на форум http://&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;unixforum&lt;/ins&gt;.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;org/&lt;/ins&gt;. Как знать, может, вашей будущей программы не хватает на нашем DVD…&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=1618&amp;oldid=prev</id>
		<title>Lockal: Ненавижу типографские кавычки… Почему они всегда лезут в исходники?</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=1618&amp;oldid=prev"/>
				<updated>2008-03-13T06:23:52Z</updated>
		
		<summary type="html">&lt;p&gt;Ненавижу типографские кавычки… Почему они всегда лезут в исходники?&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;amp;diff=1618&amp;amp;oldid=1539&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Lockal</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=1539&amp;oldid=prev</id>
		<title>Interlace: Новая: == Ruby без Rails == ''Вы слыхали о Ruby on Rails – а сейчас '''Майк Сондерс''' расскажет вам о его основе, Ruby, ярком при...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=1539&amp;oldid=prev"/>
				<updated>2008-03-12T21:26:27Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: == Ruby без Rails == &amp;#039;&amp;#039;Вы слыхали о Ruby on Rails – а сейчас &amp;#039;&amp;#039;&amp;#039;Майк Сондерс&amp;#039;&amp;#039;&amp;#039; расскажет вам о его основе, Ruby, ярком при...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Ruby без Rails ==&lt;br /&gt;
''Вы слыхали о Ruby on Rails – а сейчас '''Майк Сондерс''' расскажет вам о его основе, Ruby, ярком примере современного языка высокого уровня…''&lt;br /&gt;
&lt;br /&gt;
'''Вот и еще одна статья из цикла об «экзотических» языках программирования. Язык Tcl, с которым мы познакомились месяц назад, очень подходит для разработки оконных приложений с графическим интерфейсом, а сейчас мы займемся Ruby, предназначенным для создания серверных и сетевых приложений. Заскучали? Напрасно. Сейчас объясним, почему.'''&lt;br /&gt;
&lt;br /&gt;
Мы постараемся не погрязнуть в техноязе: на то есть подробнейшая документация. Вместо этого мы начнем с основ языка, затем напишем простенькое приложение, а в завершение – полноценный web-проект. Вы уже знакомы с азами программирования? Отлично! Читайте дальше, и вы поймете, что Ruby достоин вашего внимания. Многие из нас слышали о Ruby в контексте Ruby on Rails, современного программного каркаса [framework]. На его основе сейчас разрабатываются крупные сайты (например, Basecamp, Jobster или 43 Things), и он поставляется с новой версией OS X, Leopard. На ринг Ruby вышел совсем недавно, и тем удивительнее тот факт, что его разработка ведется с 1993 года!&lt;br /&gt;
&lt;br /&gt;
Детище Юкихиро Мацумото [Yukihiro Matsumoto] увидело свет в 1995 году. Ключевой особенностью языка стал принцип освобождения программиста от черной работы. Зачем продираться через заковыристый синтаксис, если требуется сделать что-то простое?&lt;br /&gt;
&lt;br /&gt;
Проработав более двух лет на C++ и найдя, что он все еще сталкивается с неприятными сюрпризами, Мацумото решил создать язык, максимально оправдывающий ожидания – чтобы в нем программы делали именно то, что интуитивно предполагалось, и отсутствовали тупиковые случаи. «Прежде всего надо думать о людях», провозгласил Юкихиро, «о том, как они мыслят о программе и как представляют себе действия машин. Люди – хозяева. А машины – работники».&lt;br /&gt;
&lt;br /&gt;
С историей – все, теперь о кодировании: Ruby называют «мультипарадигменным» [multiparadigm] языком. Это жутковатое слово означает, что язык включает и объектно ориентированный подход, и процедуры с функциями. Ruby – интерпретирующий язык, и его синтаксис близок к Python и Perl, поэтому он осваивается без труда.&lt;br /&gt;
&lt;br /&gt;
=== Освоимся ===&lt;br /&gt;
Для начала нам понадобятся интерпретатор языка Ruby и интерактивный интерпретатор ''irb'', поставляемые с большинством дистрибутивов. Последнюю версию этих программ вы найдете в разделе '''Разработка''' нашего DVD.&lt;br /&gt;
&lt;br /&gt;
Вызовем интерпретатор, набрав '''irb''' в командной строке. На экране появится строка приглашения – можно с ходу вводить операторы языка. По традиции полагалось бы вывести “Hello world” – «Здравствуй, мир», но это старо как мир... Будем оригинальны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
puts “Goodbye moon!”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вроде все ясно: команда '''puts''' просто выводит на экран текстовую строку. Но в Ruby абсолютно все, даже строковые константы, – это объекты. Может, оно и странно, зато позволяет делать штуки вроде&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
“BlaBlaBlaa”.length&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С виду чушь, а на выходе печатается '''10''' – вполне настоящая длина строки. Или, например,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
“Mmm, donuts”.index(“d”)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
возвращает '''5''', позицию символа '''d''' в заданной строке. (Учтите, нумерация в Ruby начинается с нуля, а не с единицы.)&lt;br /&gt;
&lt;br /&gt;
Итак, Ruby – страна объектов, где программировать значительно проще. Вдобавок, это еще и язык с динамической типизацией: переменные не нужно объявлять до их использования. Вот пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
puts “Do you love Ruby yet?”&lt;br /&gt;
answer = gets&lt;br /&gt;
puts “You answered ” + answer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На экран выводится вопрос, потом объявляется переменная '''answer''', и в нее тут же записывается результат команды '''gets''' (ввод строки с клавиатуры). Наш ответ затем выводится на экран. &lt;br /&gt;
&lt;br /&gt;
Заодно продемонстрирована операция над переменными: строки можно складывать ('''+''') и даже умножать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
mystring = “Some” + “text”&lt;br /&gt;
puts mystring&lt;br /&gt;
anotherstring = “Wowzers” * 10&lt;br /&gt;
puts anotherstring&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сначала две строки объединяются, и результат выводится на экран. Затем строка '''anotherstring''' заполняется десятью копиями строки '''Wowzers''', и результат также выводится на экран. Именно эффективные функции обработки текста обеспечили Ruby место под солнцем в мире разработчиков сайтов. Неплохо знать и метод '''chomp''' (вы могли встретить его в Perl): он убирает из строки последний символ, перевод строки ('''\n'''), который автоматически добавляется командой '''gets''' при вводе. Метод понадобится в тех случаях, когда нужно преобразовать введенную строку в число, т.е. в «голые цифры»:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
x = gets.chomp.to_i&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы создали переменную '''x''', ввели строку командой '''gets''', откинули у нее символ перевода строки с помощью '''chomp''' и методом '''to_i''' преобразовали ее в числовое значение, которое затем присвоили '''x'''. Тип переменной '''x''' можно проверить:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
x = gets.chomp.to_i&lt;br /&gt;
x.is_a?(Integer)&lt;br /&gt;
x.is_a?(String)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это показывает, что '''x''' – число, а не строка. Но мы можем немедля использовать '''x''' и как строку, если надо – благодаря динамической типизации. [Вопросительный знак является допустимым символом и часто используется в Ruby в именах методов, которые «отвечают на вопрос», – прим. ред.]&lt;br /&gt;
&lt;br /&gt;
=== Условия, циклы и функции ===&lt;br /&gt;
Разобравшись с переменными и вводом/выводом строк, перейдем к управляющим конструкциям языка. Каждый из приведенных ниже примеров нужно предварительно сохранить в текстовом файле и запускать командой '''ruby &amp;lt;имя_файла&amp;gt;'''. Сохраните следующий пример в файле '''test.rb''' и запустите командой '''ruby test.rb''' – он иллюстрирует использование условного оператора '''if''' и кодовых блоков:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
puts “How many kittens do you have?”&lt;br /&gt;
x = gets.chomp.to_i&lt;br /&gt;
if x &amp;gt; 0 # More than zero kittens&lt;br /&gt;
    puts “You have ” + x.to_s + “ kittens”&lt;br /&gt;
else&lt;br /&gt;
    puts “Aww, you have no kittens!”&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы запрашиваем у пользователя строку, затем уже известным нам методом '''to_i''' преобразуем ее в число. Далее оператор условия '''if''' сравнивает введенное число с нулем. Если условие в операторе '''if''' истинно, число преобразуется в строку с помощью метода '''to_s''', чтоб вписать его в сообщение, и сообщение выводится его на экран.&lt;br /&gt;
&lt;br /&gt;
Если же пользователь ввел '''0''', выполняются команды, расположенные после '''else''', то есть выводится другое сообщение. Блок кода завершается командой '''end'''. Между прочим, для лучшей читаемости текста мы применили отступы – можно их вводить клавишей табуляции, а можно и просто пробелами. Все как в других языках!&lt;br /&gt;
&lt;br /&gt;
Справа от оператора '''if''' помещен комментарий (в языке Ruby они предваряются символом '''#''').&lt;br /&gt;
&lt;br /&gt;
С циклами тоже проблем нет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
10.times do&lt;br /&gt;
    puts “Ruby rocks”&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все ясно – десять раз выводится строка! Оператор '''while''' ничуть не сложнее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
x = 0&lt;br /&gt;
while x != 15&lt;br /&gt;
    puts “Please enter 15”&lt;br /&gt;
    x = gets.chomp.to_i&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этот код требует у пользователя ввода строки до тех пор, пока не получит число '''15'''. Тогда он покидает блок '''while/end''' и продолжает выполнение кода (правда, в данном случае выполнять уже нечего).&lt;br /&gt;
&lt;br /&gt;
Программирование на языке высокого уровня обязательно подразумевает модульность, так что займемся процедурами. Как мы уже говорили, Ruby – объектно-ориентированный (ОО) язык, аналогично C++, C# или Python. Но даже если вы знакомы только с обычным C, можете не бояться ОО-сложностей, по крайней мере, на начальном этапе. Рассмотрим использование функций:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
def doubler(value)&lt;br /&gt;
    value = value * 2&lt;br /&gt;
    return value&lt;br /&gt;
end&lt;br /&gt;
puts “Enter a number”&lt;br /&gt;
x = gets.chomp.to_i&lt;br /&gt;
y = doubler(x)&lt;br /&gt;
puts y.to_s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первая половина скрипта – описание функции, она не будет исполняться при запуске. Функция '''doubler''' умножает число '''value''' (аргумент функции) на два и возвращает результат. Из кода видно, как используется функция. (Обратите внимание, что функции должны быть объявлены до их использования, иначе Ruby выдаст ошибку.)&lt;br /&gt;
&lt;br /&gt;
{{Врезка|&lt;br /&gt;
Заголовок=Ссылки|&lt;br /&gt;
Содержание=&lt;br /&gt;
* http://www.ruby-lang.org Домашняя страница Ruby.&lt;br /&gt;
* http://rubyforge.org Библиотеки и программы.&lt;br /&gt;
* http://www.rubycentral.com/book Отличный учебный курс по Ruby.&lt;br /&gt;
* http://tryruby.hobix.com Онлайн-курс.|&lt;br /&gt;
Ширина=50%}}&lt;br /&gt;
Выполнение программы начинается с команды '''puts''': у пользователя запрашивают число, и оно передается в качестве параметра функции '''doubler'''. Результат, возвращаемый функцией, записывается в переменную '''y'''. Наконец, значение переменной '''y''' выводится на экран. Создание объектов в Ruby выходит за рамки данной статьи; хотите узнать больше – обратитесь на сайты, указанные во врезке «Ссылки» на этой странице.&lt;br /&gt;
&lt;br /&gt;
=== Работать чисто ===&lt;br /&gt;
Обработка исключительных ситуаций в Ruby блаженно проста, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
puts “Divide 5 by what?”&lt;br /&gt;
x = gets.chomp.to_i&lt;br /&gt;
begin&lt;br /&gt;
    y = 10 / x&lt;br /&gt;
rescue ZeroDivisionError&lt;br /&gt;
    puts “Eeep, divide by zero!”&lt;br /&gt;
end&lt;br /&gt;
puts y.to_s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы берем у пользователя число, потом входим в блок '''begin/end''' с разделом '''rescue''' внутри. Если пользователь, допустим, введет '''5''', в переменную '''y''' записывается частное от деления '''10''' на '''5''' и результат выводится на экран.&lt;br /&gt;
&lt;br /&gt;
А вдруг он введет ноль? Возникнет ошибка. В таких случаях происходит возврат в командную строку и вывод сообщения, над которым вы и будете ломать голову. Но мы не зря ввели обработчик исключения. Возникшая исключительная ситуация (деление на ноль) будет зафиксирована, и выполнится оператор '''puts''' внутри обработчика исключения, который выведет на экран сообщение об ошибке.&lt;br /&gt;
&lt;br /&gt;
Обработка исключений исключительно удобна: она спасает вас от ползания по коду в поисках проблемы и вставки проверок куда ни попадя. Ваш опрятный и компактный код отловит множество видов ошибок при исполнении, открытии файла и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Создаем web-сервер ===&lt;br /&gt;
Применим полученные знания и напишем собственный… web-сервер! Экстрим? Да нет, в Ruby это совсем несложно, благодаря библиотеке socket. Конечно, для ''Apache'' наш сервер конкурентом пока не станет, но зато продемонстрирует возможности Ruby. И вообще, зачем устанавливать и настраивать мощный сервер, если вам всего-то нужно хранить пару web-страничек для доступа к ним по локальной сети? Вы напишете собственный сервер на Ruby быстрее, чем произнесете “/etc/apache/httpd.conf”!&lt;br /&gt;
&lt;br /&gt;
Сохраните следующий код в файле '''webserver.rb''' в вашем домашнем каталоге. (Если вам лень набирать, возьмите его из раздела '''Magazine/Ruby''' нашего DVD.) Затем создайте в этом же каталоге две HTML-странички: '''index.html''' и '''test.html''', с произвольным содержимым, лишь бы выводилось в браузере.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require ‘socket’&lt;br /&gt;
webserver = TCPServer.new(‘127.0.0.1’, 7125)&lt;br /&gt;
while (session = webserver.accept)&lt;br /&gt;
    session.print “HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n”&lt;br /&gt;
    request = session.gets&lt;br /&gt;
    trimmedrequest = request.gsub(/GET\ \//, ‘’).gsub(/\ HTTP.*/, ‘’)&lt;br /&gt;
    filename = trimmedrequest.chomp&lt;br /&gt;
    if filename == “”&lt;br /&gt;
        filename = “index.html”&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
        displayfile = File.open(filename, ‘r’)&lt;br /&gt;
        content = displayfile.read()&lt;br /&gt;
        session.print content&lt;br /&gt;
    rescue Errno::ENOENT&lt;br /&gt;
        session.print “File not found”&lt;br /&gt;
    end&lt;br /&gt;
    session.close&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустите программу командой '''ruby webserver.rb''' и проверьте, как она работает. Для этого в адресной строке браузера введите '''&amp;lt;nowiki&amp;gt;http://127.0.0.1:7125&amp;lt;/nowiki&amp;gt;'''. Если все нормально, вы должны увидеть содержимое странички '''index.html'''! Соответственно, набрав '''&amp;lt;nowiki&amp;gt;http://127.0.0.1:7125/test.html&amp;lt;/nowiki&amp;gt;''', вы увидите содержимое странички '''test.html'''. Код говорит сам за себя, но мы все равно разберем его подробно.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|&lt;br /&gt;
Заголовок=Модные модули|&lt;br /&gt;
Содержание=&lt;br /&gt;
Ruby поставляется с набором модулей, расширяющих возможности языка, подобно библиотекам C модулям Python. В зависимости от используемого дистрибутива и версии Ruby их расположение может различаться, например, в Ubuntu 6.06, они расположены в каталоге '''/usr/lib/ruby/1.8/i486-linux/'''. В стандартную поставку входят модули для разработки сетевых приложений, сжатия данных с использованием ''zlib'', консольных приложений на базе ''Ncurses'' и многие другие. Их функциональность добавляется в программу строкой '''require''', как в нашем примере с сервером.&lt;br /&gt;
&lt;br /&gt;
Дополнительные модули можно загрузить через систему RubyGems, аналогичную CPAN для Perl. Разработаны модули для взаимодействия с базой данных MySQL, разработки приложений для Gnome и KDE и т.д. Похоже, недолго ждать времени, когда на Ruby можно будет сделать почти любое приложение рабочего стола. За дополнительной информацией обращайтесь на сайт [http://rubyforge.org RubyForge] (см. врезку «Ссылки»).|&lt;br /&gt;
Ширина=40%}}&lt;br /&gt;
Начинается код с команды '''require''', подключающей внешние библиотеки. В данном случае мы используем библиотеку '''socket''' – это набор процедур, сильно упрощающий сетевое программирование (см. врезку «Модные модули» справа). Следующая строка создает объект сервера на локальном IP-адресе '''127.0.0.1''' и порте '''7125'''. Номер порта может быть любым, но для использования портов до тысячного (например, '''80''') потребуются права администратора системы.&lt;br /&gt;
&lt;br /&gt;
У нас получился сервер локальной сети; а мы хотим, чтоб с ним могли работать web-браузеры. Цикл '''while''' обрабатывает запросы к серверу, пока в окне терминала не нажать клавиши '''Ctrl+C'''. Внутри этого цикла сервер принимает запрос клиента и посылает браузеру стандартный ответ из двух строк: сообщение, что запрос принят, и HTML-заголовок. Символы '''\r''' и '''\n''' означают «возврат каретки» и «перевод строки» соответственно.&lt;br /&gt;
&lt;br /&gt;
Затем обрабатывается запрос, полученный от браузера. Обычно он выглядит примерно так: '''GET /filename.html HTTP/1.1'''. Нам нужно определить в нем имя запрошенного файла. Сохраним строку запроса в переменной '''request''' и извлечем оттуда имя файла методом '''gsub''': он отделит от строки части GET и HTTP/1.1 при помощи регулярных выражений. '''Gsub''' напоминает командную утилиту '''sed''' – быстрый способ заместить или отделить части строковой переменной.&lt;br /&gt;
&lt;br /&gt;
От полученного имени файла с помощью метода '''chomp''' отделяется последний символ перевода строки, после чего результат сохраняется в переменной '''filename'''.&lt;br /&gt;
&lt;br /&gt;
Большинство web-серверов, если имя файла не указано, по умолчанию загружают '''index.html'''. Блок '''if''' так и делает: если строка с именем файла пуста, переменной '''filename''' присваивается '''index.html'''. Можно, конечно, использовать и другой файл.&lt;br /&gt;
&lt;br /&gt;
После этого (внутри блока '''begin/end''') мы открываем полученный файл на чтение и записываем в переменную '''content''' его содержимое, прочитанное с помощью функции '''read()'''. Содержимое файла отсылается браузеру, методом '''session.print'''. А вдруг такого файла не найдется? Тогда '''rescue''' отправит браузеру сообщение об ошибке.&lt;br /&gt;
&lt;br /&gt;
=== Мысли напоследок ===&lt;br /&gt;
Вот сервер и готов. Удивительно просто, правда? Конечно, пока он обрабатывает только HTML-файлы – но были бы кости, мясо нарастет. Главное, что это пример применения Ruby в реальной задаче, и по нему видно, что код получается чудесно-простой и легко читаемый.&lt;br /&gt;
&lt;br /&gt;
В Ruby еще много чего можно исследовать, и так как Ruby on Rails продолжает набирать популярность, вы об этом языке, несомненно, еще услышите. Ясный и разумный синтаксис Ruby лучше всех прочих поможет разобраться с объектно-ориентированным программированием тем, кто привык к С или Basic. Внизу слева находится врезка «Ссылки», там вы найдете и учебники, и прочую информацию. А напишете нечто крутое – сообщите нам на форум http://www.linuxforum.ru. Как знать, может, вашей будущей программы не хватает на нашем DVD...&lt;/div&gt;</summary>
		<author><name>Interlace</name></author>	</entry>

	</feed>