38 votes

Quelle est la différence entre STDIN et $ stdin en Ruby?

Ruby a deux manières de se référer à la norme d'entrée: L' STDIN constante , et l' $stdin variable globale.

Hormis le fait que je peux attribuer une autre IO objet d' $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?

40voto

sepp2k Points 157757

Si $stdin est réaffecté, STDIN n'est pas affectée. De même, $stdin n'est pas affectée lorsque STDIN 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'appelant reopen1 sur l'un affecte les autres.

Toutes les constructions en ruby méthodes d'utilisation $< (un.k.un. ARGF) pour lire l'entrée. Si ARGV est vide, ARGF lit à partir de $stdin, donc si vous réaffectez $stdin, ce qui influera sur le tout intégré dans les méthodes. Si vous réaffectez STDIN il n'aura aucun effet à moins que certains 3rd party méthode utilise STDIN.

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 $stdin.

2 Vous pouvez bien sûr également utiliser $</ARGF à être encore plus cohérente avec les méthodes intégrées, mais la plupart du temps, vous n'avez pas envie de l' ARGF problème si vous utilisez explicitement le flux stdin.

1voto

mtelis Points 191

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X