大家好,我是学习Ruby的新手 我正在练习从文件中获取数据
puts "what is your filename?"
filename = $stdin.gets.chomp
从第二行我可以得到我想要读取的文件名 但是,如果我只是编写gets.chomp,它将变成一个错误 我已经知道$ stdin意味着标准输入,但仍然无法理解这一点 谁能帮我? THX
答案 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