В чем разница между $stdout
(перед знаком доллара) и STDOUT
(заглавными буквами) в Ruby ? Что следует использовать при перенаправлении вывода и почему? То же самое $stderr
и с STDERR
.
Изменить: только что нашел связанный вопрос .
В чем разница между $stdout
(перед знаком доллара) и STDOUT
(заглавными буквами) в Ruby ? Что следует использовать при перенаправлении вывода и почему? То же самое $stderr
и с STDERR
.
Изменить: только что нашел связанный вопрос .
$stdout
и STDOUT
vs $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
изменяет значение $>
и наоборот.