37

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

4

4 回答 4

42

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

于 2012-05-09T20:27:30.400 回答
29

gets.chomp()ARGV=先读

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

于 2013-11-05T21:21:15.770 回答
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} ?"

你在终端运行

$ ruby color.rb blue yellow green

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

现在在下面的行中用“stdin.gets.chomp”替换“gets.chomp”

least_fav_color = $stdin.gets.chomp

并在终端中运行以下命令

$ ruby color.rb blue yellow green

然后你的程序运行!

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

于 2017-02-19T01:49:19.617 回答
4

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

于 2014-02-20T12:30:33.153 回答