Разница между $ stdout и STDOUT в Ruby - PullRequest
85 голосов
/ 13 июля 2011

В Ruby, в чем разница между $stdout (с предшествующим знаком доллара) и STDOUT (во всех заглавных буквах)?При перенаправлении вывода, что следует использовать и почему?То же самое касается $stderr и STDERR.

Редактировать: Только что нашел связанный вопрос .

Ответы [ 3 ]

102 голосов
/ 13 июля 2011

$stdout - это глобальная переменная , представляющая текущий стандартный вывод.STDOUT - это константа , представляющая стандартный вывод, и обычно это значение по умолчанию $stdout.

Если STDOUT является константой, вы не должны переопределять ее, однакоВы можете переопределить $stdout без ошибок / предупреждений (переопределение STDOUT вызовет предупреждение).Например, вы можете сделать:

$stdout = STDERR

То же самое относится к $stderr и STDERR


Итак, чтобы ответить на другую часть вашего вопроса, используйте глобальные переменныеперенаправить вывод, а не константы.Просто будьте осторожны, чтобы в дальнейшем изменить его в своем коде, переопределение глобальных переменных может повлиять на другие части вашего приложения.

5 голосов
/ 03 марта 2016

И $stdout, и STDOUT имеют разные значения. Документация Ruby довольно ясна по этой теме:

  • $stdout - Текущий стандартный вывод.
  • STDOUT - Стандартный вывод.Значение по умолчанию для $ stdout.

Если вы хотите записать в стандартный вывод, тогда вы на самом деле имеете в виду стандартный вывод current , поэтому вам следует записать в $stdout.

STDOUT тоже не бесполезен.Хранит значение по умолчанию для $stdout.Если вы когда-нибудь переназначите $stdout, вы можете восстановить его до прежнего значения с помощью $stdout = STDOUT.

Кроме того, есть еще одна предопределенная переменная:

  • $> - Вывод по умолчанию для print, printf, который по умолчанию равен $stdout.

Однако в Ruby 2.3 он выглядит как псевдоним для $stdout.Переназначение $stdout изменяет значение $> и наоборот.

5 голосов
/ 13 июля 2011
  • STDOUT является глобальной константой, поэтому ее не следует изменять.
  • $stdout является предопределенной переменной, поэтому ее можно изменить.

Если вы используете оболочку для перенаправления:

$ ruby test.rb > test.log

тогда не имеет значения, какой файл вы используете в качестве дескриптора файла для вашего скрипта, определяется до того, как ваш скрипт будет выполнен.

Однако, если вы пытаетесь изменить дескриптор файла для STDOUT ОС из скрипта на Ruby, например, чтобы отправить вывод во вращающийся набор файлов журналов на основе текущего дня недели, тогда вам нужно чтобы убедиться, что вы используете $stdout.

...