Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

locked = file.flock(File::LOCK_EX | File::LOCK_NB)

# Пытаемся заблокировать файл, но не приостанавливаем программу, если

# не получилось; в таком случае переменная locked будет равна false.

Для семейства операционных систем Windows эта функция не реализована.

10.1.7. Простой ввод/вывод

Вы уже знакомы с некоторыми методами ввода/вывода из модуля

Kernel
; мы вызывали их без указания вызывающего объекта. К ним относятся функции
gets
и
puts
, а также
print
,
printf
и
p
(последний вызывает метод объекта
inspect
, чтобы распечатать его в понятном для нас виде).

Но есть и другие методы, которые следует упомянуть для полноты. Метод

putc
выводит один символ. (Парный метод
getc
не реализован в модуле
Kernel
по техническим причинам, однако он есть у любого объекта класса
IO
). Если параметром является объект
String
, то печатается первый символ строки.

putc(?\n) # Вывести символ новой строки.

putc("X") # Вывести букву X.

Интересный вопрос: куда направляется вывод, если эти методы вызываются без указания объекта? Начнем с того, что в среде исполнения Ruby определены три глобальные константы, соответствующие трем стандартным потокам ввода/вывода, к которым мы привыкли в UNIX. Это

STDIN
,
STDOUT
и
STDERR
. Все они имеют тип
IO
.

Имеется также глобальная переменная

$stdout
, именно в нее направляется весь вывод, формируемый методами из
Kernel
. Она инициализирована значением
STDOUT
, так что данные отправляются на стандартный вывод, как и следовало ожидать. В любой момент переменной
$stdout
можно присвоить другое значение, являющееся объектом
IO
.

diskfile = File.new("foofile","w")

puts "Привет..." # Выводится на stdout.

$stdout = diskfile

puts "Пока!" # Выводится в файл "foofile".

diskfile.close

$stdout = STDOUT # Восстановление исходного значения.

puts "Это все." # Выводится на stdout.

Помимо метода

gets
в модуле
Kernel
есть методы ввода
readline
и
readlines
. Первый аналогичен
gets
в том смысле, что возбуждает исключение
EOFError
при попытке читать за концом файла, а не просто возвращает
nil
. Последний эквивалентен методу
IO.readlines
(то есть считывает весь файл в память).

Откуда мы получаем ввод? Есть переменная

$stdin
, которая по умолчанию равна
STDIN
. Точно так же существует поток стандартного вывода для ошибок (
$stderr
, по умолчанию равен
STDERR
).

Еще имеется интересный глобальный объект

ARGF
, представляющий конкатенацию всех файлов, указанных в командной строке. Это не объект класса
File
, хотя и напоминает таковой. По умолчанию ввод связан именно с этим объектом, если в командной строке задан хотя бы один файл.

# Прочитать все файлы, а затем вывести их.

puts ARGF.read

# А при таком способе более экономно расходуется память:

while ! ARGF.eof?

 puts ARGF.readline

end

# Пример: ruby cat.rb file1 file2 file3

При чтении из стандартного ввода (

stdin
) методы
Kernel
не вызываются. Потому можно обойти (или не обходить)
ARGF
, как показано ниже:

# Прочитать строку из стандартного ввода.

str1 = STDIN.gets

# Прочитать строку из ARGF.

str2 = ARGF.gets

# А теперь снова из стандартного ввода.

str3 = STDIN.gets

10.1.8. Буферизованный и небуферизованный ввод/вывод

В некоторых случаях Ruby осуществляет буферизацию самостоятельно. Рассмотрим следующий фрагмент:

print "Привет... "

sleep 10

print "Пока!\n"

Если запустить эту программу, то вы увидите, что сообщения «Привет» и «Пока» появляются одновременно, после завершения

sleep
. При этом первое сообщение не завершается символом новой строки.

Это можно исправить, вызвав метод

flush
для опустошения буфера вывода. В данном случае вывод идет в поток
$defout
(подразумеваемый по умолчанию для всех методов
Kernel
, которые занимаются выводом). И поведение оказывается ожидаемым, то есть первое сообщение появляется раньше второго.

  • Читать дальше
  • 1
  • ...
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: