В Ruby все является объектом — даже то, чего в Ruby на самом деле нет. Прекрасным примером этого является класс IO, который обрабатывает ввод и вывод между программами Ruby и окружающей файловой системой и устройствами.
Хотя класс ввода-вывода Ruby содержит множество различных подклассов (включая файлы, временные файлы и сокеты), наиболее распространенными и часто используемыми объектами ввода-вывода являются stdin, sdtout, и stderror, которые оборачивают потоки данных, соответствующие вводу, выводу и информации об ошибках соответственно.
Всякий раз, когда процесс запускается в ОС *nix, будь то Ruby, Python или просто ваш Терминал, эти три потока запускаются вместе с ним. Хотя они называются файлами и могут быть «расположены» в вашей папке /dev, стандартные имена потоков ввода-вывода представляют собой просто дескрипторы файлов («файловые дескрипторы») и не могут рассматриваться как обычные файлы.
Они древние и могущественные. И очень низкий уровень. Естественно, Ruby упрощает работу с ними.
IO в Руби
В данной программе Ruby позволит вам ссылаться и даже изменять стандартные потоки ввода-вывода — они инициализируются при запуске как константы и глобальные переменные: STDIN/$stdin, STDOUT/$stdout и STDERR/$stderr.
Используя эти ссылки на объекты, мы можем многое сделать без потоков ввода-вывода; мы можем изменить их имена (хотя это обычно не рекомендуется), вызывать их в методах и даже перенаправлять в другие места.
Хотя изменение констант или глобальных переменных, как правило, запрещено, соглашение и чистое программирование диктуют, что, когда нам нужно переименовать или перенаправить поток ввода-вывода, изменяется глобальная переменная, а не константа. Ниже показано, как перенаправить $stdout.
Если вы запустите указанную выше программу, она напечатает «У нас есть коды» в ваш новый файл… и затем выдаст ошибку (за попытку деления на ноль). Наша новая глобальная переменная в действии.
Вперед и вверх
Стандартные потоки ввода, вывода и ошибок необходимы для понимания операций ввода-вывода в Ruby и *nix-подобных системах, но это лишь верхушка айсберга.
Ниже приведены некоторые ресурсы для более глубокого изучения операций ввода-вывода и файловых систем:
Руководство Linux по стандартному выводу, вводу и ошибкам:
RubyMonk в потоках ввода-вывода:
Блог Thoughtbot о потоках ввода-вывода: