Если $stdin
переназначен, на STDIN
это не влияет.Аналогично, на $stdin
не влияет, когда STDIN
переназначается (что вполне возможно (хотя и бессмысленно), но выдаст предупреждение).Однако, если ни одна из переменных не была переназначена, они обе указывают на один и тот же объект ввода-вывода, поэтому вызов reopen
¹ для одного из них повлияет на другой.
Все встроенные методы ruby используют $<
(иначе ARGF
) для чтения ввода.Если ARGV
пусто, ARGF
читает из $stdin
, поэтому, если вы переназначите $stdin
, это повлияет на все встроенные методы.Если вы переназначите STDIN
, это не будет иметь эффекта, если какой-либо сторонний метод не использует STDIN
.
. В вашем собственном коде вы должны использовать $stdin
, чтобы соответствовать встроенным методам².
¹ reopen
- это метод, который может перенаправить объект ввода-вывода в другой поток или файл.Однако вы не можете использовать его для перенаправления ввода-вывода в StringIO, поэтому он не исключает все случаи переназначения $stdin
.
² Конечно, вы также можете использовать $<
/ ARGF
длябудьте еще более совместимы со встроенными методами, но большую часть времени вы не хотите использовать поведение ARGF
, если вы явно используете поток stdin.