在以下脚本中:
first, second, third = ARGV
puts "The oldest brothers name is #{first}"
puts "The middle brothers name is #{second}"
puts "The youngest brothers name is #{third}"
puts "What is your moms name?"
mom = $stdin.gets.chomp
puts "What is your dads name?"
dad = $stdin.gets.chomp
puts "In the my family there are three sons #{first}, #{second}, #{third}, and a mom named #{mom}, and a father named #{dad}"
如果没有$stdin
,我无法使用 gets
命令接受用户输入。我必须使用$stdin.gets
才能使其正常工作。
为什么?ARGV
做了什么来禁用此功能?默认情况下$stdin
不包含在 gets
命令中吗?
从 get 函数文档中:
返回(并分配给 $_)ARGV 中的文件列表中的下一行(或 $*),如果命令行上不存在任何文件,则从标准输入返回(并分配给 $_)。
因此,如果将命令行参数传递给 ruby 程序,gets
将不再从$stdin
读取,而是从您传递的那些文件中读取。
想象一下,我们在一个名为 argv.rb
的文件中有一个简短的代码示例:
first, second = ARGV
input = gets.chomp
puts "First: #{first}, Second: #{second}, Input #{input}"
我们创建了以下文件:
$ echo "Alex" > alex
$ echo "Bob" > bob
我们像ruby argv.rb alex bob
一样运行我们的程序,输出将是:
First: alex, Second: bob, Input Alex
请注意,input
的值是"Alex",因为这是第一个文件"alex"的内容。如果我们第二次调用gets
,返回的值将是"Bob",因为这是下一个文件"bob"中的内容。