ruby-on-rails - 在 ruby​​-on-rails 中,文件在完成一次迭代后是否会关闭?

标签 ruby-on-rails ruby file-io rails-console

根据我的概念,当使用打开文件时

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/

相关文章:

ruby-on-rails - Rails 4 和 Action 缓存

matrix - 读取并覆盖同一个文件

ruby - "Incompatible library version"on nokogiri

C# File.Open 和 Stream 等效项

java - 程序计算 txt 文件中数字的频率并将结果保存到另一个 txt 文件中?

ruby-on-rails - 跳过 : registration vs remove :registerable

ruby-on-rails - 你如何启用与 "sunspot for rails"的部分匹配?

ruby-on-rails - Ruby/Rails 性能 : OpenURI vs NET:HTTP vs Curb vs Rest-Client

c - 将 C 中的 Ruby block 与 SWIG 结合使用

ruby-on-rails - Cucumber - 启用默认驱动程序(selenium)时数据库清理器不工作