Лучшие практики для освобождения объектов в рубине - PullRequest
4 голосов
/ 28 октября 2010

Допустим, у меня есть класс logger, у которого есть атрибут, указывающий на открытый файл. Этот файл должен быть открыт, пока этот класс больше не используется. Что-то вроде:

class MyLogger
  attr_accessor :log_file
  def initialize
    @log_file = File.new('my_log_file_name.log','w')
  end

  def finalize(id)
    @log_file.close
  end
end

Как я могу гарантировать, что когда я больше не буду использовать этот экземпляр, дескриптор файла будет закрыт? Я пробовал это, но без эффекта:

l = MyLogger.new
l = nil
ObjectSpace.garbage_collect

После этого, если я попытаюсь удалить файл, он выдаст ошибку о том, что файл используется.

Ответы [ 4 ]

3 голосов
/ 28 октября 2010

Просто закройте дескриптор файла через вызов метода.На самом деле не имеет смысла делать это иначе, особенно в ожидании сборщика мусора.Если ты знаешь, что с тобой покончено, сделай свою уборку на этом этапе.

0 голосов
/ 29 октября 2010

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

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

0 голосов
/ 28 октября 2010

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

0 голосов
/ 28 октября 2010

Если вам нужно освободить ресурсы от объекта, сделайте это явно.

Я нашел этот пример исходного кода полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...