Скриптовый язык Ruby. Легкий путь в мир программирования. Часть 2
Синтаксис языка
Общие понятия
Как уже было сказано, программа на языке Ruby представляет собой текстовый файл. Строение его нельзя назвать сложным: одна строка – одна команда (или командная конструкция). То есть разделителем команд служит символ «перевод строки».
То есть строки
puts 77
и
puts "test"
будут правильными, а
puts 77 puts "test"
будет ошибочной.
Правда, в случае необходимости, например при вводе данных, в качестве разделителя можно использовать точку с запятой:
print "Введите значение:" 7; a = gets
Для данных разделители не требуются. Перечисления элементов массива или текстовые данные могут занимать произвольное количество строк. Главное, чтобы в конце был закрывающий символ.
Ruby – регистрозависимый транслятор. Если команда называется «puts», то интерпретатор и воспримет именно «puts», но никак не «PUTS» или «Puts».
Операции с данными Ruby производит в основном двумя способами.
Первый способ используется со времен создания первых языков программирования. Его можно определить как КОМАНДА ДАННЫЕ. Например:
puts a, 55
Второй способ характерен для современных объектно-ориентированных языков. Он формулируется как ОБЪЕКТ.МЕТОД
a = (133).chr
worktext=wfile.readlines.to_s
fname = ARGF.filename.dup.gsub!(/\.txt/i, ".fb2"),"w"
Как видим, к объекту можно применять несколько методов, один за другим, нанизывая их как бусинки в ожерелье. И некоторые методы могут требовать для выполнения аргументы.
И третий, гораздо реже используемый способ называется ПРОЦЕДУРА (АРГУМЕНТЫ).
Комментарии
В тексте программы, как и полагается, могут быть комментарии. Они отделяются значком «#». Все, что правее «#», воспринимается транслятором как комментарий.
puts rez # вывести результирующую переменную
Для пространных комментариев предусмотрена такая конструкция:
=begin
Начало комментария
…
Конец комментария
=end
То есть все строки, заключенные между =begin и =end являются комментариями.
Вообще-то, эта конструкция предназначена для документирования программ на Ruby, но ничего не мешает использовать ее, к примеру, для временного исключения кусков кода.
Зарезервированные слова
Хотя, как уже говорилось выше, Ruby позволяет переопределять команды, в нем есть так называемые зарезервированные слова, то есть команды, командные конструкции и логические понятия, смысл которых меняться не должен ни при каких обстоятельствах.
Это: BEGIN, END, alias, and, begin, break, case, class, def, defined?, do, else, elsif, end, ensure, false, for, if, in, module, next, nil, not, or, redo, rescue, retry, return, self, super, then, true, undef, unless, until, when, while, yield, __FILE__, __ENCODING__, __LINE__. Важное замечание для неанглоязычных программистов
Я думаю, вы заметили, что в самом первом примере слово «Привет!» было написано латиницей. Неужели Ruby не поддерживает кириллицу?
Отнюдь. Запустите Notepad (для чистоты эксперимента), наберите:
puts "Привет!"
и сохраните его под именем, скажем, text.rb.
Запустите скрипт на выполнение.
Oops! На экране появится нечто вроде
|ЁштхЄ!
Дело тут вот в чем. Запуск скриптов мы производим из командной консоли. А она устроена так, что вывод символов в ней происходит в кодовой таблице CP-866 (DOS). Мы же набирали свой скрипт в кодировке Windows (CP-1251).
Поэтому запускаем редактор для программиста (или встроенный редактор FAR Manager) и переключаем его в кодовую таблицу DOS. В редакторе FAR Manager для этого служит клавиша Shift-F8. Вновь наберите текст скрипта.
puts "Привет!"
Теперь, после запуска скрипта на экране должно появиться:
Привет!
Если же опять будет выведена белиберда, и вы ничего не напутали с кодовой таблицей скрипта, скорее всего, ваша консоль просто не может выводить кириллицу. Проверьте это, переключив раскладку клавиатуры и набрав в командной строке что-нибудь в русской кодировке. Если появятся кракозябры, отрегулируйте региональные настройки Windows и\или добавьте нужные шрифты.
Из всего вышесказанного следует резонный вывод, что если вы планируете вывод русскоязычных сообщений на консоль, то скрипт следует
готовить в кодировке DOS.
Тут сразу же возникает одно маленькое, но вредное «но». Как быть, если в тексте должны быть фрагменты в кодировке Windows? Например, ключевые слова для поиска в обрабатываемых файлах. Выбор здесь невелик. Либо делать сообщения англоязычными, либо, что гораздо изящнее, добавить в текст программы ма-аленькую подпрограммку, перекодирующую текст перед выводом на экран.
Представление данных в Ruby
На свете не слишком много программ, которые все данные для обработки берут непосредственно в процессе работы путем ввода. Как правило, текст программы уже содержит какие-то данные: базовые значения, ключевые слова, массивы для перекодировки и т.д. и т.п. Такие данные называются литералами. Поэтому перед тем, как приступить к программированию, следует разобраться, как же эти литералы оформляются. И что собой представляют данные вообще.
Понятие класса
Как уже было сказано, Ruby – объектно-ориентированный язык программирования, причем настолько ориентированный, что в нем буквально все является объектами. Соответственно, в Ruby нет понятия «типы данных». Вместо этого существует понятие «класс».
Класс – это совокупность свойств и методов обработки для группы объектов.
Классы в объектно-ориентированном программировании имеют ряд характерных особенностей, таких как:
- Инкапсуляция. Данные, их свойства и методы для обработки этих данных в классе объединены в неразрывное целое.
- Наследование. На базе класса могут создаваться производные (дочерние) классы. Так, от класса Numbers отпочковываются классы Integer и Float. А все классы Ruby имеют единого прародителя: SuperClass.
- Полиморфизм. Так называют способность классов менять свои свойства и поведение сообразно поставленной задаче. То есть можно создать класс-потомок, затем объявить в нем метод, одноименный с унаследованным (т.е. перекрыть его) и реализовать в нем требуемые действия (вид поведения).
Кроме того, Ruby позволяет переопределять методы и во встроенных классах.
Числа
Десятичные числа записываются в тексте Ruby-программ «как есть».
a = 15
b = 3000000000000000000
Можно даже так:
a = 2_721_553 # a будет равно 2721553
Десятичные дроби (они же числа с плавающей запятой, они же вещественные числа) также представляются «как есть».
a = 775.56546
b = 0.0000003
puts a, b
На экран будет выведено:
775.56546
3.0e-007
Длинные дроби Ruby, по возможности, переводит в сокращенную запись. То есть 3.0e-007 равняется 3 * 10-7 или 0.0000003.
Кроме того, Ruby позволяет представлять числа в двоичной, восьмеричной и шестнадцатеричной формах. Для этого используется префикс «0». Просто «0» подразумевает восьмеричное число, «0b» и «0х» - двоичное и шестнадцатеричное соответственно.
a = 0b11101001 # десятичное значение – 233
b = 0xFF454 # дес. знач. – 1045588
c = 0150 # дес. знач. – 104
И еще есть так называемая символьная форма. Если нам нужен код символа, нет нужды искать таблицу ASCII. Спросим нужное значение у Ruby:
a = ?ф # a равно 223
Все числа относятся к классу Numeric. Он делится на подклассы Integer (целочисленные) и Float (числа с плавающей запятой). Integer, в свою очередь, делится на два подкласса: Fixnum – целые числа, занимающие одно машинное слово (от -230 до 230-1 – для 32-битных процессоров или же от -262 to 262-1 для процессоров 64-битных) и Bignum – целые числа, не входящие в этот промежуток.
Строки
Текстовые данные в Ruby представляют собой последовательность однобайтовых кодов, каждый из которых соответствует одному символу или служебному коду. В версиях транслятора 1.9 уже реализована нормальная работа с двухбайтовыми кодировками (Unicode, UTF-8), но для наших задач более чем достаточно возможностей, предоставляемых однобайтовыми кодировками.
Для оформления текстовых значений используют кавычки, одинарные и двойные.
str1 = 'Строка 1'
str2 = "Строка 2"
При этом можно использовать специальные подстановки, или, как их еще называют, ESC-последовательности.
Наиболее часто используются:
\n – перевод строки
\xnn – символ в шестнадцатеричном представлении, где nn - код символа.
a = "\xA71. Введение: \nПункт 1.\nАбзац..."
А если нам понадобится использовать в тексте сам символ «\»? Не вопрос. Вставляем в текст последовательность «\\» и в выходном будет нужный нам «\». Точно также, кстати, можно оформлять и кавычки. Этот прием называется «экранирование». К примеру, текст: «
c = "
В текстовые переменные можно включать выражения. Делается это при помощи подстановки #{}
p = 45
puts "Площадь квадрата равна: #{p*p} кв.м."
Получим:
Площадь квадрата равна: 2025 кв.м.
Используя такие подстановки, не следует забывать, что вычисление и, вообще, включение числовых данных в строку происходит в момент
присвоения значения означенной строке, но не вывода ее.
Например, результатом работы такого вот скрипта:
c, d, f = 0, 34, 75
a = "Сумма: #{c}"
c = d + f
puts a
станет «0», а вовсе не «109».
Еще одна немаловажная особенность. В текстовых литералах, оформленных одинарными кавычками, подстановки-выражения и ESC-последовательности (кроме «\\» и «\’» НЕ ПРЕДУСМОТРЕНЫ.
Можно оформлять строковые данные и. вообще, не применяя кавычки, но используя в качестве ограничителей произвольные символы.
puts %q!текстовая строка!
puts %QфBattlecruiser "Hammer"ф
Текстовые многострочные литералы можно представить и в таком виде:
w_text = "Да вам, куда ни сошли, - хуже не будет.
Так что прощайте! И зла на сердце не
держите! Налегке, оно легче уходить...
Г. Горин. \"Поминальная молитва\""
При этом все разрывы (переводы) строк будут правильно идентифицированы и включены в строковую переменную.
И, наконец, для оформления многострочных текстовых данных в Ruby предусмотрен специальный способ, который так и называется: «документ» (here documents).
Он заключается в том, что текст, сразу после строки присваивания и вплоть до ключевого слова (которое называется терминатором) считается строковыми данными.
Слово-терминатор должно быть в строке лишь одно. После него не допускается размещать даже комментарии. Желательно также, чтобы слово- терминатор шло с начала строки.
v1 = <
Средь оплывших свечей и вечерних молитв,
Средь военных трофеев и мирных костров,
Жили книжные дети, не знавшие битв,
Изнывая от детских своих катастроф.
stanza1
v2_3 = <<"stanza2",<<-stanza3
Детям вечно досаден
Их возраст и быт -
И дрались мы до ссадин,
До смертных обид.
stanza2
Но одежды латали
Нам матери в срок,
Мы же книги глотали,
Пьянея от строк.
stanza3
Как видно из примера, если отступ перед терминатором все же присутствует, это потребует символа «минус» в строке присвоения значения переменной.
По умолчанию строковые данные, оформленные таким образом, считаются текстом в двойных кавычках. Если нам нужен текст в одинарных кавычках, терминатор в строке присвоения тоже нужно отбить одинарными кавычками:
Диапазоны
Когда требуется определить принадлежность значения к определенному диапазону, в первую очередь требуется описать сам диапазон.
Это делается при помощи операторов «..» и «...»:
1..7 # числа от 1 по 7 ВКЛЮЧИТЕЛЬНО
2...9 # числа от 2 до 8. 9 – В ДИАПАЗОН НЕ ВХОДИТ
В таком виде диапазоны в Ruby используются, в основном, в операциях сравнения, счетчиках или для заполнения массивов. Но их можно объявить и как самостоятельный объект класса Range.
Диапазон может быть не только числовым, но и символьным:
'a'..'z'
И даже таким:
'boom'..'boot'
В последнем случае диапазон будет содержать слова: boom, boon, booo, и т.д. вплоть до boot.
Диапазон в любой момент может быть легко преобразован в массив.
arr = ('boom'.. 'boot').to_a
Юзич yuzich17@mail.ru
Общие понятия
Как уже было сказано, программа на языке Ruby представляет собой текстовый файл. Строение его нельзя назвать сложным: одна строка – одна команда (или командная конструкция). То есть разделителем команд служит символ «перевод строки».
То есть строки
puts 77
и
puts "test"
будут правильными, а
puts 77 puts "test"
будет ошибочной.
Правда, в случае необходимости, например при вводе данных, в качестве разделителя можно использовать точку с запятой:
print "Введите значение:" 7; a = gets
Для данных разделители не требуются. Перечисления элементов массива или текстовые данные могут занимать произвольное количество строк. Главное, чтобы в конце был закрывающий символ.
Ruby – регистрозависимый транслятор. Если команда называется «puts», то интерпретатор и воспримет именно «puts», но никак не «PUTS» или «Puts».
Операции с данными Ruby производит в основном двумя способами.
Первый способ используется со времен создания первых языков программирования. Его можно определить как КОМАНДА ДАННЫЕ. Например:
puts a, 55
Второй способ характерен для современных объектно-ориентированных языков. Он формулируется как ОБЪЕКТ.МЕТОД
a = (133).chr
worktext=wfile.readlines.to_s
fname = ARGF.filename.dup.gsub!(/\.txt/i, ".fb2"),"w"
Как видим, к объекту можно применять несколько методов, один за другим, нанизывая их как бусинки в ожерелье. И некоторые методы могут требовать для выполнения аргументы.
И третий, гораздо реже используемый способ называется ПРОЦЕДУРА (АРГУМЕНТЫ).
Комментарии
В тексте программы, как и полагается, могут быть комментарии. Они отделяются значком «#». Все, что правее «#», воспринимается транслятором как комментарий.
puts rez # вывести результирующую переменную
Для пространных комментариев предусмотрена такая конструкция:
=begin
Начало комментария
…
Конец комментария
=end
То есть все строки, заключенные между =begin и =end являются комментариями.
Вообще-то, эта конструкция предназначена для документирования программ на Ruby, но ничего не мешает использовать ее, к примеру, для временного исключения кусков кода.
Зарезервированные слова
Хотя, как уже говорилось выше, Ruby позволяет переопределять команды, в нем есть так называемые зарезервированные слова, то есть команды, командные конструкции и логические понятия, смысл которых меняться не должен ни при каких обстоятельствах.
Это: BEGIN, END, alias, and, begin, break, case, class, def, defined?, do, else, elsif, end, ensure, false, for, if, in, module, next, nil, not, or, redo, rescue, retry, return, self, super, then, true, undef, unless, until, when, while, yield, __FILE__, __ENCODING__, __LINE__. Важное замечание для неанглоязычных программистов
Я думаю, вы заметили, что в самом первом примере слово «Привет!» было написано латиницей. Неужели Ruby не поддерживает кириллицу?
Отнюдь. Запустите Notepad (для чистоты эксперимента), наберите:
puts "Привет!"
и сохраните его под именем, скажем, text.rb.
Запустите скрипт на выполнение.
Oops! На экране появится нечто вроде
|ЁштхЄ!
Дело тут вот в чем. Запуск скриптов мы производим из командной консоли. А она устроена так, что вывод символов в ней происходит в кодовой таблице CP-866 (DOS). Мы же набирали свой скрипт в кодировке Windows (CP-1251).
Поэтому запускаем редактор для программиста (или встроенный редактор FAR Manager) и переключаем его в кодовую таблицу DOS. В редакторе FAR Manager для этого служит клавиша Shift-F8. Вновь наберите текст скрипта.
puts "Привет!"
Теперь, после запуска скрипта на экране должно появиться:
Привет!
Если же опять будет выведена белиберда, и вы ничего не напутали с кодовой таблицей скрипта, скорее всего, ваша консоль просто не может выводить кириллицу. Проверьте это, переключив раскладку клавиатуры и набрав в командной строке что-нибудь в русской кодировке. Если появятся кракозябры, отрегулируйте региональные настройки Windows и\или добавьте нужные шрифты.
Из всего вышесказанного следует резонный вывод, что если вы планируете вывод русскоязычных сообщений на консоль, то скрипт следует
готовить в кодировке DOS.
Тут сразу же возникает одно маленькое, но вредное «но». Как быть, если в тексте должны быть фрагменты в кодировке Windows? Например, ключевые слова для поиска в обрабатываемых файлах. Выбор здесь невелик. Либо делать сообщения англоязычными, либо, что гораздо изящнее, добавить в текст программы ма-аленькую подпрограммку, перекодирующую текст перед выводом на экран.
Представление данных в Ruby
На свете не слишком много программ, которые все данные для обработки берут непосредственно в процессе работы путем ввода. Как правило, текст программы уже содержит какие-то данные: базовые значения, ключевые слова, массивы для перекодировки и т.д. и т.п. Такие данные называются литералами. Поэтому перед тем, как приступить к программированию, следует разобраться, как же эти литералы оформляются. И что собой представляют данные вообще.
Понятие класса
Как уже было сказано, Ruby – объектно-ориентированный язык программирования, причем настолько ориентированный, что в нем буквально все является объектами. Соответственно, в Ruby нет понятия «типы данных». Вместо этого существует понятие «класс».
Класс – это совокупность свойств и методов обработки для группы объектов.
Классы в объектно-ориентированном программировании имеют ряд характерных особенностей, таких как:
- Инкапсуляция. Данные, их свойства и методы для обработки этих данных в классе объединены в неразрывное целое.
- Наследование. На базе класса могут создаваться производные (дочерние) классы. Так, от класса Numbers отпочковываются классы Integer и Float. А все классы Ruby имеют единого прародителя: SuperClass.
- Полиморфизм. Так называют способность классов менять свои свойства и поведение сообразно поставленной задаче. То есть можно создать класс-потомок, затем объявить в нем метод, одноименный с унаследованным (т.е. перекрыть его) и реализовать в нем требуемые действия (вид поведения).
Кроме того, Ruby позволяет переопределять методы и во встроенных классах.
Числа
Десятичные числа записываются в тексте Ruby-программ «как есть».
a = 15
b = 3000000000000000000
Можно даже так:
a = 2_721_553 # a будет равно 2721553
Десятичные дроби (они же числа с плавающей запятой, они же вещественные числа) также представляются «как есть».
a = 775.56546
b = 0.0000003
puts a, b
На экран будет выведено:
775.56546
3.0e-007
Длинные дроби Ruby, по возможности, переводит в сокращенную запись. То есть 3.0e-007 равняется 3 * 10-7 или 0.0000003.
Кроме того, Ruby позволяет представлять числа в двоичной, восьмеричной и шестнадцатеричной формах. Для этого используется префикс «0». Просто «0» подразумевает восьмеричное число, «0b» и «0х» - двоичное и шестнадцатеричное соответственно.
a = 0b11101001 # десятичное значение – 233
b = 0xFF454 # дес. знач. – 1045588
c = 0150 # дес. знач. – 104
И еще есть так называемая символьная форма. Если нам нужен код символа, нет нужды искать таблицу ASCII. Спросим нужное значение у Ruby:
a = ?ф # a равно 223
Все числа относятся к классу Numeric. Он делится на подклассы Integer (целочисленные) и Float (числа с плавающей запятой). Integer, в свою очередь, делится на два подкласса: Fixnum – целые числа, занимающие одно машинное слово (от -230 до 230-1 – для 32-битных процессоров или же от -262 to 262-1 для процессоров 64-битных) и Bignum – целые числа, не входящие в этот промежуток.
Строки
Текстовые данные в Ruby представляют собой последовательность однобайтовых кодов, каждый из которых соответствует одному символу или служебному коду. В версиях транслятора 1.9 уже реализована нормальная работа с двухбайтовыми кодировками (Unicode, UTF-8), но для наших задач более чем достаточно возможностей, предоставляемых однобайтовыми кодировками.
Для оформления текстовых значений используют кавычки, одинарные и двойные.
str1 = 'Строка 1'
str2 = "Строка 2"
При этом можно использовать специальные подстановки, или, как их еще называют, ESC-последовательности.
Наиболее часто используются:
\n – перевод строки
\xnn – символ в шестнадцатеричном представлении, где nn - код символа.
a = "\xA71. Введение: \nПункт 1.\nАбзац..."
А если нам понадобится использовать в тексте сам символ «\»? Не вопрос. Вставляем в текст последовательность «\\» и в выходном будет нужный нам «\». Точно также, кстати, можно оформлять и кавычки. Этот прием называется «экранирование». К примеру, текст: «
align="right">http:\\dat.com
» оформляется так:c = "
http:\\\\dat.com
"В текстовые переменные можно включать выражения. Делается это при помощи подстановки #{}
p = 45
puts "Площадь квадрата равна: #{p*p} кв.м."
Получим:
Площадь квадрата равна: 2025 кв.м.
Используя такие подстановки, не следует забывать, что вычисление и, вообще, включение числовых данных в строку происходит в момент
присвоения значения означенной строке, но не вывода ее.
Например, результатом работы такого вот скрипта:
c, d, f = 0, 34, 75
a = "Сумма: #{c}"
c = d + f
puts a
станет «0», а вовсе не «109».
Еще одна немаловажная особенность. В текстовых литералах, оформленных одинарными кавычками, подстановки-выражения и ESC-последовательности (кроме «\\» и «\’» НЕ ПРЕДУСМОТРЕНЫ.
Можно оформлять строковые данные и. вообще, не применяя кавычки, но используя в качестве ограничителей произвольные символы.
puts %q!текстовая строка!
puts %QфBattlecruiser "Hammer"ф
Текстовые многострочные литералы можно представить и в таком виде:
w_text = "Да вам, куда ни сошли, - хуже не будет.
Так что прощайте! И зла на сердце не
держите! Налегке, оно легче уходить...
Г. Горин. \"Поминальная молитва\""
При этом все разрывы (переводы) строк будут правильно идентифицированы и включены в строковую переменную.
И, наконец, для оформления многострочных текстовых данных в Ruby предусмотрен специальный способ, который так и называется: «документ» (here documents).
Он заключается в том, что текст, сразу после строки присваивания и вплоть до ключевого слова (которое называется терминатором) считается строковыми данными.
Слово-терминатор должно быть в строке лишь одно. После него не допускается размещать даже комментарии. Желательно также, чтобы слово- терминатор шло с начала строки.
v1 = <
Средь оплывших свечей и вечерних молитв,
Средь военных трофеев и мирных костров,
Жили книжные дети, не знавшие битв,
Изнывая от детских своих катастроф.
stanza1
v2_3 = <<"stanza2",<<-stanza3
Детям вечно досаден
Их возраст и быт -
И дрались мы до ссадин,
До смертных обид.
stanza2
Но одежды латали
Нам матери в срок,
Мы же книги глотали,
Пьянея от строк.
stanza3
Как видно из примера, если отступ перед терминатором все же присутствует, это потребует символа «минус» в строке присвоения значения переменной.
По умолчанию строковые данные, оформленные таким образом, считаются текстом в двойных кавычках. Если нам нужен текст в одинарных кавычках, терминатор в строке присвоения тоже нужно отбить одинарными кавычками:
Диапазоны
Когда требуется определить принадлежность значения к определенному диапазону, в первую очередь требуется описать сам диапазон.
Это делается при помощи операторов «..» и «...»:
1..7 # числа от 1 по 7 ВКЛЮЧИТЕЛЬНО
2...9 # числа от 2 до 8. 9 – В ДИАПАЗОН НЕ ВХОДИТ
В таком виде диапазоны в Ruby используются, в основном, в операциях сравнения, счетчиках или для заполнения массивов. Но их можно объявить и как самостоятельный объект класса Range.
Диапазон может быть не только числовым, но и символьным:
'a'..'z'
И даже таким:
'boom'..'boot'
В последнем случае диапазон будет содержать слова: boom, boon, booo, и т.д. вплоть до boot.
Диапазон в любой момент может быть легко преобразован в массив.
arr = ('boom'.. 'boot').to_a
Юзич yuzich17@mail.ru
Компьютерная газета. Статья была опубликована в номере 25 за 2010 год в рубрике программирование