Разница между $stdout и STDOUT в Ruby

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

Изменить: Просто нашел связанный вопрос.

Ответ 1

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

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

$stdout = STDERR

То же самое происходит для $stderr и STDERR


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

Ответ 2

  • STDOUT - глобальная константа, поэтому ее не следует изменять.
  • $stdout - предопределенная переменная, поэтому ее можно изменить.

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

$ ruby test.rb > test.log

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

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

Ответ 3

Оба $stdout и STDOUT имеют разные значения. Ruby documentation довольно понятна в этой теме:

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

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

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

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

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

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