根据我的概念,当使用打开文件时
infile = File.open(fname)
只有当我这样做时才可以/应该关闭它
infile.close
现在我尝试在 Rails 控制台上执行以下操作
infile.each do |line|
puts line
end
下次我尝试做同样的事情时,我没有任何输出。但是,如果我再次执行 infile = File.open(fname)
,上面的代码将开始给出正确的输出(仅适用于 1 次后续尝试)。
我在这里缺少什么?文件正在关闭吗?或者文件指针指向末尾(但再次根据我的概念。每个都应该处理这一点)
最佳答案
据我了解,这就是您正在尝试的:
infile = File.open(fname)
infile.each do |line|
puts line
end #=> Prints the lines
infile.each do |line|
puts line
end #=> Prints nothing
infile.close
发生这种情况是因为迭代 IO 实例会保留您正在读取的行的指针;我猜想是为了 POSIX 一致性,这反射(reflect)在 Ruby 解释器实现(纯 C)中,因此也反射(reflect)在 Ruby API 中。
当您运行重置行指针的指令时,例如关闭和重新打开文件,指针将再次位于文件的开头,并且 each
将从文件的开头迭代.
如果您想重申,可以倒转
IO 指针:
infile = File.open(fname)
infile.each do |line|
puts line
end #=> Prints the lines
infile.rewind
infile.each do |line|
puts line
end #=> Prints the lines
infile.close
或者使用IO#reopen
:
infile = File.open(fname)
infile.each do |line|
puts line
end #=> Prints the lines
infile.reopen File.open(fname)
infile.each do |line|
puts line
end #=> Prints the lines
infile.close
或者关闭文件并创建另一个实例:
infile = File.open(fname)
infile.each do |line|
puts line
end #=> Prints the lines
infile.close
infile = File.open(fname)
infile.each do |line|
puts line
end #=> Prints the lines
infile.close
关于ruby-on-rails - 在 ruby-on-rails 中,文件在完成一次迭代后是否会关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23471580/