Подтвердить что ты не робот

Какая разница между get.chomp() и STDIN.gets.chomp()?

Являются ли они одинаковыми или существуют тонкие различия между двумя командами?

4b9b3361

Ответ 1

gets будет использовать Kernel#gets, который сначала пытается прочитать содержимое файлов, переданных через ARGV. Если в ARGV нет файлов, вместо этого он будет использовать стандартный ввод (в какой момент он будет таким же, как STDIN.gets.

Примечание. Как отметил эхрористоферсон, Kernel#gets действительно вернется к $stdin, а не STDIN. Однако, если вы не назначили $stdin другому входному потоку, по умолчанию он будет идентичен STDIN.

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

Ответ 2

gets.chomp()= сначала прочитать ARGV

STDIN.gets.chomp()= читать пользовательский ввод

Ответ 3

Если ваш файл 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} ?"

и вы запустите в терминале

$ ruby color.rb blue yellow green

он выдает ошибку (нет такой ошибки файла)

теперь замените 'gets.chomp' на 'stdin.gets.chomp' в строке ниже

least_fav_color = $stdin.gets.chomp

и запустите в терминале следующую команду

$ ruby color.rb blue yellow green

тогда ваша программа будет работать.

В принципе, как только вы начали вызывать ARGV с самого начала (как это делает ARGV), get.chomp больше не может выполнять свою работу. Время довести большую артиллерию: $stdin.gets.chomp

Ответ 4

потому что если в ARGV есть материал, по умолчанию метод get пытается обрабатывать первый файл как файл и читать От этого. Для чтения с пользовательского ввода (т.е. Stdin) в такой ситуации вы должны использовать это STDIN. Является явно.