Являются ли они одинаковыми или существуют тонкие различия между двумя командами?
Какая разница между get.chomp() и STDIN.gets.chomp()?
Ответ 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. Является явно.