В 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 о потоках ввода-вывода:

https://robots.thoughtbot.com/io-in-ruby