Запись Ruby в несколько файлов в цикле не дает ожидаемого ответа

#ruby

#ruby

Вопрос:

У меня есть некоторый код ruby, который должен выполняться и создавать некоторые файлы с выводами в нем.

Когда я запускаю код один раз, у меня вообще не возникает никаких проблем, но когда я пытаюсь запустить его в цикле, первый файл выходит с обычным выводом, но из второго файла все они следуют причудливому шаблону.

Если я запускаю его три раза, первый вывод приходит нормально, второй приходит с информацией о первом, за которой следует вывод, который он должен иметь, а третий сначала приходит с первым и вторым выводом, а затем это обычный вывод.

Это код, который я использую для чтения файла:

 File.open(path, 'rb') { |file| file.read }
  

Это код, который я использую для записи в файл:

  File.open(path   '.txt', 'w') do |f|
  f.write text
 end
  

Это часть кода, который я использую для многократного запуска:

 while i < 4 do
    sample_path = "#{path}/samples/sample#{i}.html.erb"
    controller_grabber.grab_controllers(sample_path)
    answer_string = file_manager.read_file("#{path}/samples/sample#{i}_expected_answer.txt").gsub(/s /, "")
    tool_answer = file_manager.read_file("#{path}/outputs/#{file_manager.get_file_name(sample_path)}_output.txt").gsub(/s /, "")
    i  = 1
end
  

В grab_controllers я вызываю write file один раз. Я действительно понятия не имею, в чем может быть причина, попытался создать новый экземпляр controller_grabber и file_manager, но это не сработало

Вот несколько примеров результатов, которые я получаю

Первый ожидаемый результат:

 [name: Show, type: @otml_file]
[name: Back, type: otml_files_path]
  

Результат:

 [name: Show, type: @otml_file]
[name: Back, type: otml_files_path]
  

Второй ожидаемый результат:

 [name: Inicio, type: root_path]
[name: Producto, type: productos_index_path]
[name: Venta, type: venta_index_path]
[name: Proveedor, type: proveedor_index_path]
[name: Clientes, type: cliente_index_path]
  

Второй результат:

 [name: Show, type: @otml_file]
[name: Back, type: otml_files_path]
[name: Inicio, type: root_path]
[name: Producto, type: productos_index_path]
[name: Venta, type: venta_index_path]
[name: Proveedor, type: proveedor_index_path]
[name: Clientes, type: cliente_index_path]
  

Ответ №1:

Это кажется банальным. Я предполагаю, что у вас есть постоянная ссылка на файл в каком-то коде, который опущен — это трудно увидеть с текущим объемом кода.

Когда я читаю, пишу, считываю в цикле, я получаю то, что вы ожидаете:

 path = 'filename'
text = 'something'

10.times {
  p File.open(path, 'rb') { |file| file.read }

  result = File.open(path, 'w ') do |f|
    f.write text
  end

  p result

  p File.open(path, 'rb') { |file| file.read }
}
  

Если вы уверены, что хотите перезаписывать файл при каждом проходе, то вам, вероятно, следует удалять файл каждый раз.

Или дайте им разные имена…

Возможно, с дополнительной информацией я смогу быть более полезным.