В чем разница между $stdout(перед знаком доллара) и STDOUT(заглавными буквами) в Ruby ? Что следует использовать при перенаправлении вывода и почему? То же самое $stderrи с STDERR.
Изменить: только что нашел связанный вопрос .
В чем разница между $stdout(перед знаком доллара) и STDOUT(заглавными буквами) в Ruby ? Что следует использовать при перенаправлении вывода и почему? То же самое $stderrи с STDERR.
Изменить: только что нашел связанный вопрос .
$stdoutи STDOUTvs $stdinи STDINсимметричны, различия между $stdoutи $>vs $stdinи $<нет.
Ответы:
$stdout- глобальная переменная , представляющая текущий стандартный вывод. STDOUT- константа, представляющая стандартный вывод, обычно это значение по умолчанию$stdout .
Поскольку STDOUTэто константа, вы не должны переопределять ее, однако вы можете переопределить $stdoutбез ошибок / предупреждений (переопределение STDOUTвызовет предупреждение). например, вы можете:
$stdout = STDERR
То же самое касается $stderrиSTDERR
Итак, чтобы ответить на другую часть вашего вопроса, используйте глобальные переменные для перенаправления вывода, а не константы. Просто будьте осторожны, чтобы снова изменить это в своем коде, переопределение глобальных переменных может повлиять на другие части вашего приложения.
$>выходной поток по умолчанию, а не $stdout.
$stdoutи $>являются псевдонимами, поэтому переназначение один будет влиять на других.
IO#reopenв случае $stdout? Я категорически не согласен с этим мнением. $stdout.reopenМетод мутирует его приемник , и это будет влиять , STDOUTесли вы не переназначить $stdoutраньше. Они не должны быть синонимами, в этом нет ничего плохого, если они имеют разные значения из-за назначения и повторного открытия, STDOUTвы нарушаете его цель.
STDOUT является глобальной константой, поэтому ее не следует изменять. $stdout - это предопределенная переменная, поэтому ее можно изменить.Если вы используете оболочку для перенаправления:
$ ruby test.rb > test.log
тогда не имеет значения, какой из них вы используете в качестве дескриптора файла для вашего скрипта, определяется до того, как ваш скрипт будет выполнен.
Однако, если вы пытаетесь изменить файловый дескриптор для STDOUT ОС из вашего Ruby-скрипта, например, для отправки вывода во вращающийся набор файлов журнала на основе текущего дня недели, тогда вам нужно убедиться, что вы используете $stdout.
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Оба $stdoutи STDOUTимеют разное значение. Документация Ruby по этой теме довольно ясна:
$stdout- Текущий стандартный вывод.STDOUT- Стандартный вывод. Значение по умолчанию для $ stdout.
Когда вы хотите писать на стандартный вывод, вы фактически имеете в виду текущий стандартный вывод, поэтому вы должны писать в$stdout .
STDOUTтоже не бесполезен. В нем хранится значение по умолчанию для $stdout. Если вы когда-либо переназначаете $stdout, вы можете восстановить его до предыдущего значения с помощью $stdout = STDOUT.
Кроме того, есть еще одна предопределенная переменная:
$>- Вывод по умолчанию для print, printf, который$stdoutпо умолчанию.
Однако похоже, что в Ruby 2.3 он просто ведет себя как псевдоним для $stdout. Переназначение $stdoutизменяет значение $>и наоборот.