Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
trap(1) { puts "Перехвачен сигнал 1" }
sleep 2
Process.kill(1,0) # Послать самому себе.
О применениях метода trap
в более сложных ситуациях читайте в документации по Ruby и UNIX.
В модуле Process
есть также методы для опроса и установки таких атрибутов процесса, как идентификатор пользователя, действующий идентификатор пользователя, приоритет и т.д. Дополнительную информацию вы отыщете в справочном руководстве по Ruby.
14.1.4. Стандартный ввод и вывод
В главе 10 мы видели, как работают методы IO.popen
и IO.pipe
, но существует еще небольшая библиотека, которая иногда бывает удобна.
В библиотеке Open3.rb
есть метод popen3
, который возвращает массив из трех объектов IO
. Они соответствуют стандартному вводу, стандартному выводу и стандартному выводу для ошибок того процесса, который был запущен методом popen3
. Вот пример:
require "open3"
filenames = %w[ file1 file2 this that another one_more ]
inp, out, err = Open3.popen3("xargs", "ls", "-l")
filenames.each { |f| inp.puts f } # Писать в stdin процесса.
inp.close # Закрывать обязательно!
output = out.readlines # Читать из stdout.
errout = err.readlines # Читать также из stderr.
puts "Послано #{filenames.size} строк входных данных."
puts "Получено #{output.size} строк из stdout"
puts "и #{errout.size} строк из stderr."
В этом искусственном примере мы выполняем команду ls -l
для каждого из заданных имен файлов и по отдельности перехватываем стандартный вывод и стандартный вывод для ошибок. Отметим, что вызов close
необходим, чтобы порожденный процесс увидел конец файла. Также отметим, что в библиотеке Open3 используется метод fork
, не реализованный на платформе Windows; для этой платформы придется пользоваться библиотекой win32-open3
(ее написали и поддерживают Дэниэль Бергер (Daniel Berger) и Парк Хисоб (Park Heesob)). См. также раздел 14.3.
14.2. Флаги и аргументы в командной строке
Слухи о кончине командной строки сильно преувеличены. Хоть мы и живем в век графических интерфейсов, ежедневно тысячи и тысячи программистов по тем или иным причинам обращаются к командным утилитам.
Мы уже говорили, что корнями своими Ruby уходит в UNIX. Но даже в Windows существует понятие командной строки, и, честно говоря, мы не думаем, что в обозримом будущем она исчезнет.
На этом уровне для управления работой программы применяются аргументы и флаги. О них мы и поговорим ниже.
14.2.1. Разбор флагов в командной строке
Для разбора командной строки чаще всего применяется библиотека getoptlong
(библиотека getopts.rb
, обладающая менее развитой функциональностью, считается устаревшей). Она понимает однобуквенные и длинные флаги и распознает двойной дефис ( --
) как признак конца флагов. В целом библиотека ведет себя так же, как соответствующие функции GNU.
Необходимо создать объект класса GetoptLong
, который и будет выполнять функции анализатора. Затем ему передаются допустимые значения флагов, а он извлекает их по одному.
У объекта-анализатора есть метод set_options
, который принимает список массивов. Каждый массив содержит один или несколько флагов (в виде строк) и один «признак наличия аргумента», который говорит, должны ли эти флаги сопровождаться аргументами. Все флаги в одном массиве считаются синонимами; первый из них является «каноническим именем», которое и возвращает операция get
.
Предположим, что имеется программа, понимающая следующие флаги: -h
или --help
(печать справки), -f
или --file
(указание имени файла), -l
или --lines
(вывод не более указанного числа строк, по умолчанию 100).
Такая программа могла бы начинаться следующим образом:
require "getoptlong"
parser = GetoptLong.new
parser.set_options(
["-h", "--help", GetoptLong::NO_ARGUMENT],
["-f", "--file", GetoptLong::REQUIRED_ARGUMENT],
["-l", "--lines", GetoptLong::OPTIONAL_ARGUMENT])
Теперь можно в цикле вызвать метод get
(см. листинг 14.1). Наличие операторных скобок begin-end
имитирует цикл с проверкой условия в конце. У метода get
есть синоним get_option
, существуют также итераторы each
и each_option
, которые в точности идентичны.
filename = nil
lines = 0 # По умолчанию вывод не усекается.
loop do
begin
opt, arg = parser.get
break if not opt
# Только для отладки...
puts (opt +" => " + arg)
case opt
when "-h"
puts "Usage: ..."
break # Прекратить обработку, если задан флаг -h.
when "-f"
filename = arg # Запомнить аргумент - имя файла.
when "-l"
if arg != ""
lines = arg # Запомнить аргумент - число строк (если задан).
else
lines = 100 # Оставляемое по умолчанию число строк.
end
end
rescue => err
puts err
break
end
end
puts "имя файла = #{filename}"
puts "число строк = #{lines}"
Метод get
возвращает nil
, если флаг отсутствует, но пустую строку, если для флага не задан аргумент. Возможно, это ошибка.
В этом примере мы перехватываем исключения. Всего их может быть четыре:
• AmbiguousOption
— указано сокращенное длинное имя флага, но сокращение не уникально;
• InvalidOption
— неизвестный флаг;
• MissingArgument
— для флага не задан аргумент;
• NeedlessArgument
— указан аргумент для флага, который не должен сопровождаться аргументом.
Сообщения об ошибках обычно выводятся на stderr
, но вывод можно подавить, присвоив акцессору quiet=
значение true
.
Библиотека getoptlong
располагает и другими возможностями, которых мы здесь не обсуждали. Подробности вы найдете в документации.
Существуют другие библиотеки, например OptionParser
, предлагающие несколько иную функциональность. Дополнительная информация приведена в архиве приложений Ruby.
14.2.2. Константа ARGF
Глобальная константа ARGF
представляет псевдофайл, получающийся в результате конкатенации всех имен файлов, заданных в командной строке. Во многих отношениях она ведет себя так же, как объект IO
.
Когда в программе встречается «голый» метод ввода (без указания вызывающего объекта), обычно имеется в виду метод, подмешанный из модуля Kernel
(например, gets
и readlines
). Если в командной строке не задано ни одного файла, то по умолчанию источником ввода является объект stdin
. Но если файлы заданы, то данные читаются из них. Понятно, что конец файла достигается в конце последнего из указанных файлов.
Если хотите, можете обращаться к ARGF
явно:
# Скопировать все файлы на stdout.
puts ARGF.readlines
Быть может, вопреки ожиданиям, признак конца файла устанавливается после каждого файла. Так, предыдущий код выведет все файлы, а следующий — только первый файл:
Читать дальшеИнтервал:
Закладка: