web-dev-qa-db-fra.com

Quelle est la différence entre gets.chomp () et STDIN.gets.chomp ()?

Sont-ils les mêmes ou existe-t-il de subtiles différences entre les deux commandes?

37
stanigator

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

40
Dylan Markow

gets.chomp() = lire ARGV d'abord

STDIN.gets.chomp() = lire l'entrée de l'utilisateur

28
Rick Lien

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

8
cjpillette

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.

4
Shoot Sahan