Рассылка закрыта
При закрытии подписчики были переданы в рассылку "LinuxCenter News Channel: новости Linux" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Linux Gazette на русском
Информационный Канал Subscribe.Ru |
Linux Gazette на русском | Выпуск #94 | Тираж 7646 экз.
"И почему ни в одной книжке по программированию
не даётся в качестве примера программа "Road To Hell"?"
...иногда...крик души...программерской...
Всем привет! Сегодня в рассылке подаётся блюдо для программистов
или тех, кто только собирается заняться экстремальными видами
спорта, к которым можно смело отнести и программирование,
статья "Программирование на Ruby". В статье всё "по-взрослому",
даже пример "Hello, World!" есть. :) Разбор полётов, статья "Dillo -- веб-браузер быстрый как свет".
Вот кусок из переписки с Grigory Bakunov Присылайте свои вопросы и замечания по адресу lgrus@lrn.ru и, если не трудно,
сразу указывайте, можно ли использовать Ваши письма в
рассылке. Александр Куприн
Ruby представляет собой объектно-ориентированный язык
программирования интерпретирующего типа. Он был создан
программистом из Японии -- Юкихиро Матсумото (Yukihiro Matsumoto),
где этот язык пользуется большей популярностью нежели Python или
Perl! Первая часть из серии является введением в основы языка
Ruby. Более глубокий материал будет даваться в последующих
частях. Я не собираюсь превозносить язык Ruby и доказывать его
преимущества перед другими языками программирования. Большинство из
нас прекрасно понимают, что каждый язык программирования имеет свои
неповторимые черты. И ваш выбор скорее будет зависеть от ваших
личных предпочтений и доступности стандартных библиотек, нежели от
неких таинственных технических проблем. Я полагаю, что вы работаете в Linux и Ruby уже установлен у вас.
Ruby - это свободно распространяемое программное обеспечение и
поэтому нет никаких препятствий, ограничивающих его использование.
Вы можете скачать его с домашней странички проекта Ruby Начнем с обычной в таких случаях программы Hello,
World' Имена переменных должны начинаться с символа: Кроме того существуют еще две псевдопеременные, которые являются
исключением из вышеуказанного правила - это self' и
nil'. Обе они именуются как локальные переменные, но таковыми не
являются! Реальный смысл этих переменных станет вам понятен немного
позже. Имена глобальных переменных должны начинаться с символа $'.
Глобальные переменные доступны из любой части программы. Следует
отметить, что неинициализированная глобальная переменная имеет
значение 'nil'. Этот факт демонстрирует следующий
пример: Существует ряд специальных предопределенных глобальных
переменных, являющихся по сути системными переменными
интерпретатора Ruby (доступны только для чтения). Некоторые из них
приведены ниже. Имена локальных переменных должны начинаться с прописных
(маленьких) символов латинского алфавита или с символа '_'.
В отличие от глобальных переменных и ссылок на переменные,
локальные переменные не принимают значение 'nil', например,
при выполнении следующего кода: Область видимости локальных переменных ограничивается одной из
следующих разновидностей блоков программы В этом примере оператор defined?' используется для проверки
существования передаваемого ему аргумента. Результаты работы
оператора "local-variable" и "nil" понятны и так
и в комментариях не нуждаются. Имена констант начинаются с заглавных (больших) символов
латинского алфавита. Но, как правило, программирующие на Ruby, дают
константам имена, состоящие только из заглавных символов. Так,
например и 'Foo', и 'FOO' являются константами. Как
и в случае с локальными переменными, константы инициализируются
оператором присваивания, а обращение к неинициализированной
константе, равно как и попытка изменения инициализированной
константы, вызывает сообщение об ошибке. Проверьте это
самостоятельно. Строки в Ruby ограничиваются либо одинарными ('...'),
либо двойными кавычками ("..."). Однако такие строки
имеют различия между собой. При использовании двойных кавычек
допускается вставлять в строки управляющие
escape-последовательности, начинающиеся с символа '\', а
также вычислять выражения с помощью конструкции #{}. Например: Дополнительную информацию по строкам вы получите в разделе,
посвященном массивам, поскольку массивы и строки во многом похожи
друг на друга. Для определения массивов используются квадратные скобки
'[]'. Массивы в Ruby являются гетерогенными (т.е. могут
содержать данные различных типов). Однако, если вы попытаетесь заставить интерпретатор подсчитать
сумму элементов массива, показанного выше, то он выдаст сообщение
об ошибке: К массивам можно применять операции конкатенации (слияния) и
повторения. Можно получить "срез" массива: Массивы и строки взаимно конвертируемы. Массив можно
преобразовать в строку с помощью метода 'join', а строку --
в массив с помощью метода 'split'. Ассоциативные массивы (хэши (англ. hash) или словари)-- еще один
немаловажный вид представления данных. Хэши содержат пары
ключ'' и значение'', см. пример ниже: Попробуем написать функцию вычисления факториала. Математическое
определение факториала: Из-за наличия ключевого слова end' Ruby иногда называют
'Алголо-подобным' языком. В данном примере рекурсивной
функции вы можете заметить отсутствие оператора возврата результата
(return). Естественно, использование этого оператора не
возбраняется, но в данной ситуации он является излишним, поскольку
в качестве возвращаемого значения принимается результат вычисления
последнего выражения. Где i -- переменная цикла, а 0..4 -- диапазон значений. Для
строковых переменных, заголовок цикла for можно записать так: Попробуйте запустить этот пример Оператор выбора case используется для проверки набора условий. В
результате работы следующего примера вы получите 2..5 -- означает диапазон значений от 2 до 5 включительно. Здесь
проверяется - попадает ли значение переменной i в заданный
диапазон. В случае строк, оператор case будет выглядеть примерно так: Обратите внимание на слэши (символ "/"), которые
окружают ключевое слово "def". Они используются для
задания границ регулярного выражения, которые мы рассмотрим
позднее. Оператор case, из примера, приведенного выше, проверяет
попадание значения переменной i в диапазон 2..5. Эта же проверка
может быть записана несколько иначе, например: Оператор отношения '===' используется для проверки
выполнения нескольких условий одновременно и интерпретируется
подобно ключевому слову when. Попробуйте самостоятельно реализовать функцию, подобную
isalnum(),isalpha(),isnum() и т.п. с помощью оператора
'===' внутри конструкции if. При использовании конструкций if и while для проверки отдельных
значений, код может быть несколько сокращен Иногда может возникнуть необходимость в инвертировании
проверяемого условия. Так, условие "если" (if) при
инвертировании приобретает смысл "если не", условие while
-- в условие until и т.д. Существует четыре различных варианта управления исполнением
цикла. Первый, аналогичный C -- break, означает выход за тело
цикла. Второй -- next, переход в начало следующей итерации (аналог
continue в C). Третий -- redo, перезапускает текущую итерацию.
Следующий C-код иллюстрирует механизм работы этих трех методов
(break, next и redo): И четвертый вариант -- оператор return. Фактически, этот
оператор приводит не только к прерыванию цикла, но и к завершению
работы метода (функции), который содержит прерываемый цикл. Команда переводчиков: Со всеми предложениями, идеями и комментариями обращайтесь к
Александру Куприну (lgrus@lrn.ru). Убедительная
просьба: указывайте сразу, не возражаете ли Вы против публикации
Ваших отзывов в рассылке. Сайт рассылки: http://gazette.linux.ru.net
Спасибо за перевод Андрею Киселёву!
---begin---
Alexander Kuprin:
2. К сожалению, собрать из сырцов dillo, используя ваш src.rpm-пакет не
получилось -- конфигурационный скрипт ./configure не мог обнаружить
библиотеку libjpeg. Даже если указать соответствующие опции --with-jpeg-lib и
--with-jpeg-inc. Но сырцы из оригинального тарбола собирались. Методом втыка
я определил, что если не использовать две команды, прописанные в spec-файле
autoconf
automake-1.4
то dillo собирается без проблем. Сборка проводилась в среде ALT Linux Master
2.0, обновлённом Сизифусом от 11 ноября 2002 года.
Grigory Bakunov:
Там же внизу написано - я придерживаюсь linux mainstream, тоесть RH :)
То что после autoconf у вас не собирается dillo говорит о проблемах в
aclocal вашего дистрибутива или о ошибке в configure.in
Отключение autoconf и automake сломает сборку на нелинуксовых юниксах.
Дело в том что для работы с кодировками используется iconv, в linux он
находится прямо в glibc, а скажем
в FreeBSD придется ставить libiconv отдельно.
---end---
Как говорится -- без комментариев. Ну, кроме одного -- "век живи, век
учись..." :)
Автор: Hiran Ramankutty
Перевод:Андрей Киселев
Введение
Требования
Hello World
% cat > hello.rb
print "Hello World\n"
^D
% ruby hello.rb
Hello World
%
Переменные
$ глобальная переменная
@ переменная экземпляра (поле объекта, данные-член)
a-z или '_' локальная переменная
A-Z константа
Глобальные переменные
% ruby
print $foo,"\n"
$foo = 5
print $foo,"\n"
^D
%
Результат работы интерпретатора:
nil
5
Эта особенность дает возможность связывать' процедуры с
глобальными переменными, т.е. при изменении значения переменной
связанная' процедура будет вызываться автоматически. Но об
этом позже!
Локальные переменные
% ruby
print foo
^D
Вы получите сообщение об ошибке:
"undefined local variable or method 'foo' for #(object...)".
Локальная переменная, инициализированная в каком либо блоке (или
процедуре), после выхода за пределы блока становится
неопределенной. Например:
def foo(n)
k = 2 * n
print "\n",k,"\n"
print defined? k,"\n"
end
foo 3
print defined? k,"\n"
^D
Вывод интерпретатора:
6
local-variable
nil
Константы
Строки
print "\n"
print '\n'
print "\001","\n"
print '\001',"\n"
print "abcd #{5*3} efg","\n"
var = " abc "
print "1234#{var}567","\n"
^D
\n
\001
abcd 15 efg
1234abc567
Массивы
a = [1,2,"3"]
print a,"\n"
^D
123
Error!!String cannot be coerced into Fixnum
Дело в том, что элемент массива 3' хранится в виде строки.
Если вычисление суммы элементов массива задать следующим образом:
a = [1,2,"3"]
b = a[0] + a[1] + a[2].to_i
print b,"\n"
^D
6
То интерпретатор выполнит его без ошибки. Добавление '.to_i' к
3-му элементу массива (т.е. a[2].to_i) заставляет интерпретатор
выполнить преобразование содержимого элемента массива a[2] в целое
со знаком. Ради эксперимента можете попробовать подставить
'.to_s'.
a = [1,2,"3"]
print a + ["foo","bar"]
print a * 2
^D
Результат
123foobar
123123
a = [1,2,"3","foo","bar"]
print a[0],"\n"
print a[0,2],"\n"
print a[0..3],"\n"
print a[-2..2],"\n"
print a[-3..-1],"\n"
a = [1,2,3]
print a[2],"\n"
a = a.join(":")
print a[2],"\n"
print a,"\n"
a = a.split(":")
print a[2],"\n"
print a,"\n"
^D
h = {1 => 2, "2" => "4"}
print hash,"\n"
print hash[1],"\n"
print hash["2"],"\n"
print hash[5],"\n"
^D
Я, надеюсь, результаты убедительны!
Управляющие конструкции
If - else
n! = 1 (если n==0)
n! = n * (n-1)! (иначе)
На Ruby вычисление факториала может быть реализовано следующим
образом:
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
print fact 4,"\n"
В результате получится 24.
Цикл for
for i in 0..4
body-of-for
end
for i in "abc"
Цикл while
i=0
while i < 10
print i+=1,"\n"
end
Case
i = 7
case i
when 2..5
print "i in 2 to 5\n"
when 6..10
print "i in 6 to 10\n"
end
^D
i in 6 to 10
case 'abcdef'
when 'aaa','bbb'
print 'contains aaa or bbb \n"
when /def/
print "contains def \n"
end
^D
contains def
Дополнительные управляющие конструкции
(2..5) === i
i = 7
print "contained in 5..10\n" if (5..10) === i
print i-=1,"\n" while i > 0
^D
contained in 5..10
6
5
4
3
2
1
0
while(condition) {
label_redo:
goto label_next; /* ruby's "next" */
goto label_break; /* ruby's "break"*/
goto label_redo; /* ruby's "redo" */
...
...
label_next:
}
label_break:
...
Заключение
Мы рассмотрели некоторые элементарные особенности языка
программирования Ruby в том объеме, который позволит вам
написать свои первые программы. В своих следующих статьях,
посвященных этому "драгоценному камню" (слово Ruby может
быть переведено на русский язык как "рубин", прим.
перев.), я буду делиться своим опытом , приобретенным при его
изучении. До свидания!
Hiran Ramankutty
Я -- студент последнего курса Правительственного Колледжа
Компьютерных Наук в городе Трикур (Trichur). Кроме Linux, я с
большим удовольствием занимаюсь изучением физики.
Copyright (C) 2002, Hiran Ramankutty.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 81 of Linux Gazette, August 2002
Владимир Меренков, Александр Михайлов, Иван Песин, Сергей
Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн,
Андрей Киселев
Эту статью можно взять здесь: http://gazette.linux.ru.net/lg81/ramankutty.html
http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
В избранное | ||