$ stdin和其他人之间的区别get.chomp

时间:2016-10-09 07:57:33

标签: ruby

大家好,我是学习Ruby的新手 我正在练习从文件中获取数据

puts "what is your filename?"
filename = $stdin.gets.chomp

从第二行我可以得到我想要读取的文件名 但是,如果我只是编写gets.chomp,它将变成一个错误 我已经知道$ stdin意味着标准输入,但仍然无法理解这一点 谁能帮我? THX

1 个答案:

答案 0 :(得分:1)

在不指定流的情况下调用gets时,我们正在调用Kernel#gets,当指定了stream时,我们正在调用IO#gets

我相信Kernel#gets封闭了IO#gets,但在它需要创建IO对象之前,该IO对象将是所有命令行参数(ARGV)的串联(它将尝试按位置顺序打开每一个文件,然后从中读取。如果ARGV上没有剩余元素,则它将从标准输入读取。

可以使用这个简单的代码段来测试这种行为:

while gets
        puts $_
end

在没有参数的情况下运行ruby myscript.rb时,它将读取stdin,如果指定了参数,它将尝试打开文件并从中读取,它将与cat命令类似。

该流可以是tty,socket,file等:

stream = File.open('/etc/passwd','r')

puts stream.gets 

stream.close

使用套接字的简单http客户端:

require 'socket'

s = TCPSocket.new 'icanhazip.com',80

s.puts <<~EOF
GET / HTTP/1.1
Host: icanhazip.com

EOF

while line = s.gets
        puts line
end

s.close

More about Kernel#gets here

More about IO#gets