В чем разница между $stdout
(перед знаком доллара) и STDOUT
(заглавными буквами) в Ruby ? Что следует использовать при перенаправлении вывода и почему? То же самое $stderr
и с STDERR
.
Изменить: только что нашел связанный вопрос .
ruby
stdout
stderr
output-redirect
Jrdioko
источник
источник
$stdout
иSTDOUT
vs$stdin
иSTDIN
симметричны, различия между$stdout
и$>
vs$stdin
и$<
нет.Ответы:
$stdout
- глобальная переменная , представляющая текущий стандартный вывод.STDOUT
- константа, представляющая стандартный вывод, обычно это значение по умолчанию$stdout
.Поскольку
STDOUT
это константа, вы не должны переопределять ее, однако вы можете переопределить$stdout
без ошибок / предупреждений (переопределениеSTDOUT
вызовет предупреждение). например, вы можете:То же самое касается
$stderr
иSTDERR
Итак, чтобы ответить на другую часть вашего вопроса, используйте глобальные переменные для перенаправления вывода, а не константы. Просто будьте осторожны, чтобы снова изменить это в своем коде, переопределение глобальных переменных может повлиять на другие части вашего приложения.
источник
$>
выходной поток по умолчанию, а не$stdout
.$stdout
и$>
являются псевдонимами, поэтому переназначение один будет влиять на других.IO#reopen
в случае$stdout
? Я категорически не согласен с этим мнением.$stdout.reopen
Метод мутирует его приемник , и это будет влиять ,STDOUT
если вы не переназначить$stdout
раньше. Они не должны быть синонимами, в этом нет ничего плохого, если они имеют разные значения из-за назначения и повторного открытия,STDOUT
вы нарушаете его цель.STDOUT
является глобальной константой, поэтому ее не следует изменять.$stdout
- это предопределенная переменная, поэтому ее можно изменить.Если вы используете оболочку для перенаправления:
тогда не имеет значения, какой из них вы используете в качестве дескриптора файла для вашего скрипта, определяется до того, как ваш скрипт будет выполнен.
Однако, если вы пытаетесь изменить файловый дескриптор для 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
.Кроме того, есть еще одна предопределенная переменная:
Однако похоже, что в Ruby 2.3 он просто ведет себя как псевдоним для
$stdout
. Переназначение$stdout
изменяет значение$>
и наоборот.источник