Wenn $stdin
neu zugewiesen wird, ist STDIN
nicht betroffen. Ebenso ist $stdin
nicht betroffen, wenn STDIN
neu zugewiesen wird (was durchaus möglich ist (wenn auch sinnlos), aber eine Warnung erzeugt). Wenn jedoch keine der beiden Variablen neu zugewiesen wurde, zeigen beide auf dasselbe IO-Objekt, so dass das Aufrufen von reopen
¹ auf einer die andere betrifft.
Alle eingebauten Ruby-Methoden verwenden $<
(a.k.a. ARGF
), um Eingaben zu lesen. Wenn ARGV
leer ist, liest ARGF
aus $stdin
. Wenn Sie also $stdin
neu zuweisen, wirkt sich dies auf alle integrierten Methoden aus. Wenn Sie STDIN
neu zuweisen, hat dies keine Auswirkungen, es sei denn, eine Drittanbietermethode verwendet STDIN
.
In Ihrem eigenen Code sollten Sie $stdin
verwenden, um mit den integrierten Methoden zu konsistent zu sein².
¹ reopen
ist eine Methode, die ein IO-Objekt in einen anderen Stream oder eine Datei umleiten kann. Sie können es jedoch nicht verwenden, um ein IO an ein StringIO umzuleiten, sodass es nicht alle Anwendungsfälle für die Neuzuweisung von $stdin
beseitigt.
² Sie können natürlich auch $<
/ARGF
verwenden noch mehr im Einklang mit den integrierten Methoden zu sein, aber die meiste Zeit Sie wollen nicht das ARGF
Verhalten, wenn Sie explizit den stdin-Stream unter Verwendung von .
'$ stdin' ist hässlicher. –