Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
При работе с двоичными данными могут оказаться полезны метод
packArrayunpackString10.1.6. Блокировка файлов
В тех операционных системах, которые поддерживают такую возможность, метод
flockFileFile::LOCK_EXFile::LOCK_NBFile::LOCK_SHFile::LOCK_UNfile = File.new("somefile")file.flock(File::LOCK_EX) # Исключительная блокировка; никакой другой # процесс не может обратиться к файлу.file.flock(File::LOCK_UN) # Разблокировать.file.flock(File::LOCK_SH) # Разделяемая блокировка (другие # процессы могут сделать то же самое).file.flock(File::LOCK_UN) # Разблокировать.locked = file.flock(File::LOCK_EX | File::LOCK_NB)# Пытаемся заблокировать файл, но не приостанавливаем программу, если# не получилось; в таком случае переменная locked будет равна false.Для семейства операционных систем Windows эта функция не реализована.
10.1.7. Простой ввод/вывод
Вы уже знакомы с некоторыми методами ввода/вывода из модуля
KernelgetsputsprintprintfpinspectНо есть и другие методы, которые следует упомянуть для полноты. Метод
putcgetcKernelIOStringputc(?n) # Вывести символ новой строки.putc("X") # Вывести букву X.Интересный вопрос: куда направляется вывод, если эти методы вызываются без указания объекта? Начнем с того, что в среде исполнения Ruby определены три глобальные константы, соответствующие трем стандартным потокам ввода/вывода, к которым мы привыкли в UNIX. Это
STDINSTDOUTSTDERRIOИмеется также глобальная переменная
$stdoutKernelSTDOUT$stdoutIOdiskfile = File.new("foofile","w")puts "Привет..." # Выводится на stdout.$stdout = diskfileputs "Пока!" # Выводится в файл "foofile".diskfile.close$stdout = STDOUT # Восстановление исходного значения.puts "Это все." # Выводится на stdout.Помимо метода
getsKernelreadlinereadlinesgetsEOFErrornilIO.readlinesОткуда мы получаем ввод? Есть переменная
$stdinSTDIN$stderrSTDERRЕще имеется интересный глобальный объект
ARGFFile# Прочитать все файлы, а затем вывести их.puts ARGF.read# А при таком способе более экономно расходуется память:while ! ARGF.eof? puts ARGF.readlineend# Пример: ruby cat.rb file1 file2 file3При чтении из стандартного ввода (
stdinKernelARGF# Прочитать строку из стандартного ввода.str1 = STDIN.gets# Прочитать строку из ARGF.str2 = ARGF.gets# А теперь снова из стандартного ввода.str3 = STDIN.gets10.1.8. Буферизованный и небуферизованный ввод/вывод
В некоторых случаях Ruby осуществляет буферизацию самостоятельно. Рассмотрим следующий фрагмент:
print "Привет... "
