2012-05-09 13 views

Respuesta

35

gets usará Kernel#gets, que primero intenta leer el contenido de los archivos pasados ​​a través de ARGV. Si no hay archivos en ARGV, utilizará la entrada estándar en su lugar (momento en el que es el mismo que STDIN.gets

Nota:.. Como echristopherson señaló, Kernel#gets realmente caer de nuevo a $stdin, no STDIN Sin embargo, a menos que asignar $stdin a una corriente de entrada diferente, será idéntica a STDIN por defecto.

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-gets

+0

Gracias por la explicación. Tuvimos dificultades para ver la diferencia en la documentación. – stanigator

+0

¿No vuelve a $ stdin, que a menudo pasa a ser lo mismo que STDIN? – echristopherson

+0

Buena llamada, actualizada. –

19

gets.chomp() = leer ARGV primera

STDIN.gets.chomp() = leer la entrada del usuario

+0

Esta es la respuesta más simple y mejor. – James

3

porque si hay cosas en ARGV, el valor predeterminado se trata método para tratar el primero como un archivo y leer de eso. Para leer de la entrada del usuario (es decir, stdin) en tal situación, debe usar STDIN.gets explícitamente.

4

Si el archivo es color.rb

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} ?" 

y se ejecuta en el terminal de

$ ruby color.rb blue yellow green 

se generará un error (no hay tal error de archivo)

ahora reemplazar 'consigue .chomp 'por' stdin.gets.chomp 'en la línea siguiente

least_fav_color = $stdin.gets.chomp 

y se ejecutan en el terminal el comando

$ ruby color.rb blue yellow green 

entonces su programa se ejecuta tras !!

Básicamente, una vez que ha comenzado a llamar a ARGV desde el principio (como ARGV está diseñado) gets.chomp ya no puede hacer su trabajo correctamente. Es hora de traer la gran artillería: $ stdin.gets.chomp

+0

Cinturón blanco de rubí que actualmente cincela a través de las paredes de granito de Ruby the Hard Way y este capítulo me dejó perplejo hasta que encontré tu explicación. ¡Gracias por esto! – user2136000

Cuestiones relacionadas