Sont-ils les mêmes ou existe-t-il de subtiles différences entre les deux commandes?
gets
utilisera Kernel#gets
, qui essaie d'abord de lire le contenu des fichiers transmis via ARGV
. S'il n'y a pas de fichiers dans ARGV
, il utilisera à la place une entrée standard (auquel cas c'est la même chose que STDIN.gets
.
Remarque: Comme l'a fait remarquer l'échristopherson, Kernel#gets
reviendra en fait à $stdin
, pas STDIN
. Cependant, sauf si vous attribuez $stdin
à un autre flux d'entrée, il sera identique à STDIN
par défaut.
http://www.Ruby-doc.org/core-1.9.3/Kernel.html#method-i-gets
gets.chomp()
= lire ARGV
d'abord
STDIN.gets.chomp()
= lire l'entrée de l'utilisateur
Si votre fichier color.rb est
first, second, third = ARGV
puts "Your first fav color is: #{first}"
puts "Your second fav color is: #{second}"
puts "Your third fav color is: #{third}"
puts "what is your least fav color?"
least_fav_color = gets.chomp
puts "ok, i get it, you don't like #{least_fav_color} ?"
et vous courez dans le terminal
$ Ruby color.rb blue yellow green
il générera une erreur (aucune erreur de fichier de ce type)
remplacez maintenant 'gets.chomp' par 'stdin.gets.chomp' sur la ligne ci-dessous
least_fav_color = $stdin.gets.chomp
et exécutez dans le terminal la commande suivante
$ Ruby color.rb blue yellow green
alors votre programme s'exécute !!
Fondamentalement, une fois que vous avez commencé à appeler ARGV dès le départ (comme ARGV est conçu pour), gets.chomp ne peut plus faire son travail correctement. Il est temps de faire entrer la grande artillerie: $ stdin.gets.chomp
car s'il y a du contenu dans ARGV, la méthode get par défaut essaie de traiter le premier comme un fichier et de le lire. Pour lire à partir de l'entrée de l'utilisateur (c'est-à-dire, stdin) dans une telle situation, vous devez l'utiliser explicitement STDIN.gets.