gets.chomp()与STDIN.gets.chomp()之间有什么区别?

sta*_*tor 37 ruby

它们是相同的,还是两个命令之间存在细微差别?

Dyl*_*kow 38

gets将使用Kernel#gets,它首先尝试读取传入的文件的内容ARGV.如果没有文件ARGV,它将使用标准输入(此时它与...相同)STDIN.gets.

注意:正如echristopherson指出的那样,Kernel#gets实际上会回归$stdin,而不是STDIN.但是,除非您分配$stdin给不同的输入流,否则它将STDIN默认为相同.

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


小智 27

gets.chomp()=首先读取ARGV

STDIN.gets.chomp()=读取用户的输入


小智 8

如果你的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} ?"
Run Code Online (Sandbox Code Playgroud)

你在终端跑

$ ruby color.rb blue yellow green
Run Code Online (Sandbox Code Playgroud)

它会抛出一个错误(没有这样的文件错误)

现在用'stdin.gets.chomp'替换'gets.chomp',如下所示

least_fav_color = $stdin.gets.chomp
Run Code Online (Sandbox Code Playgroud)

并在终端中运行以下命令

$ ruby color.rb blue yellow green
Run Code Online (Sandbox Code Playgroud)

然后你的程序运行!!

基本上,一旦你开始调用ARGV(如ARGV的设计),gets.chomp就不能再正常工作了.是时候引进大炮了:$ stdin.gets.chomp


小智 5

因为如果 ARGV 中有内容,默认的 gets 方法会尝试将第一个内容视为文件并从中读取。要在这种情况下读取用户的输入(即 stdin),您必须显式使用 STDIN.gets。