在Ruby中写入文件时,为什么有时会在我接下来的几行代码之后发生?

时间:2017-07-17 01:11:49

标签: ruby file loops while-loop

我想写一个文件然后立即等待,直到满足某些条件,在尝试之间休息1秒。我正在尝试做的一个例子如下:

thingsToGet = ["schwifty", "down", "low"]
writeFile = File.new("myfile.txt", "w")

thingsToGet.each do |element|
  writeFile.puts "#{element}"
  while #some condition is false
    sleep(1)
  end
  ### HERE for some reason is when writeFile gets written to
end

正如你在上一条评论中所看到的那样,出于某些原因,即使writeFile.puts出现在等待条件的while循环之前,实际写入仅在while循环结束后发生。

关于为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:2)

实际上writeFile是在文件关闭后写的,而不是在while循环结束后写的;这是因为文件在流关闭后保存,因此在此之前您将无法看到文件中的任何更改。

我假设您稍后在代码中关闭该文件,或者在程序运行后自动关闭该文件(尽管您应该自行关闭它),这就是您看到文件更新的原因程序结束后。

如果您希望每次使用puts时都看到更新的文件,那么您必须每次在循环中关闭(并打开)它;例如:

thingsToGet = ['schwifty', 'down', 'low']

thingsToGet.each do |element|
    File.open('myfile.txt', 'a') do |file|
      file.puts("#{element}")
    end

    while ##some condition is false
      sleep(1)
    end
    ### HERE for some reason is when writeFile gets written to
end

要注意两件事:

  • File.open与块一起使用,因此文件将在块执行后关闭。
  • 该文件以a 打开模式打开,追加文本,而不是每次打开时都删除它(如果它打开的话)使用了w

请注意,在您写入的每一行上打开和关闭文件都可能导致程序出现性能问题。