Quelle est la différence entre l'entrée standard STDIN et $stdin en Ruby?
Ruby a deux manières de se référer à la norme d'entrée: Le STDIN
constante , et la $stdin
variable globale.
Hormis le fait que je peux attribuer une autre IO
objet de $stdin
parce que ce n'est pas une constante (par exemple, avant de bifurquer pour rediriger les IO de mes enfants), quelle est la différence entre STDIN
et $stdin
? Quand dois-je utiliser chaque dans mon code?
Si je réaffecter $stdin
, il n'affecte STDIN
?
Et cela vaut-il pour STDOUT
/$stdout
et STDER
/$stderr
?
$stdin
est plus laid.
Vous devez vous connecter pour publier un commentaire.
Si
$stdin
est réaffecté,STDIN
n'est pas affectée. De même$stdin
n'est pas affectée lorsqueSTDIN
est réaffecté (ce qui est parfaitement possible (bien qu'inutile), mais produira un message d'avertissement). Toutefois, si aucune variable a été réaffectés, ils pointent vers la même IO objet, afin de l'appelantreopen
1 sur l'un affecte les autres.Toutes ruby utilisation de méthodes
$<
(un.k.un.ARGF
) pour lire l'entrée. SiARGV
est vide,ARGF
lit de$stdin
, donc si vous réaffectez$stdin
, qui affectera toutes les méthodes intégrées. Si vous réaffectezSTDIN
elle n'aura aucun effet à moins que certains 3rd party méthode utiliseSTDIN
.Dans votre propre code, vous devez utiliser
$stdin
pour être compatibles avec le haut-methods2.1
reopen
est une méthode qui permet de rediriger un IO objet d'un autre cours ou d'un fichier. Cependant, vous ne pouvez pas l'utiliser pour rediriger les e /s d'un StringIO, afin de ne pas éliminer toutes les utilisations cas de réaffectation des$stdin
.2 Vous pouvez bien sûr également utiliser
$<
/ARGF
pour être encore plus cohérente avec les méthodes intégrées, mais la plupart du temps, vous ne pas voulez leARGF
problème si vous utilisez explicitement le flux stdin.$<
(la valeur par défaut du flux d'entrée) et$>
(flux de sortie par défaut) et ni$stdin
/STDIN
ni$stdout
/STDOUT
. En fait, c'est à peu près le point de l'ensemble de$<
et$>
: ce que vous pouvez rediriger l'entrée et la sortie des méthodes telles que laKernel#puts
sans affectant stdin/stdout.$<
et$>
, je vais corriger cela. Mais vous n'êtes pas juste à propos de votre deuxième point:$>
et$stdout
sont des alias, donc réaffectation des on affectera les autres (contrairement à STDOUT qui reste inchangée).$<
est le même queARGF
, qui pas être réaffectés. Cependant réaffectation des$stdin
est affecter$<
etARGF
parce queARGF
lit de$stdin
siARGV
est vide.STDERR $et stderr sont pointant vers la même chose au début, vous pouvez réattribuer la variable globale, mais vous ne devriez pas jouer avec la constante. $stdin et STDIN, $sortie standard et la sortie standard STDOUT paires sont de même.
J'ai dû changer STDERR une couple de fois, comme une alternative à un singe, patcher des joyaux de la sortie des messages d'erreur avec STDERR.met. Si vous réaffectez avec STDERR = $stdout vous obtenez un avertissement alors que STDERR.rouvrir('nul', 'w') va sans dire.