Есть ли способ переопределить / отключить self.new? - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь найти способ безопасного освобождения ресурсов, приобретенных классом.Я пытался использовать finalize, но это ненадежно.Иногда я закрываю свою программу до того, как у GC появится шанс освободить ресурсы.

Поэтому я решил использовать экземпляр класса в блоке, например:

class Foo

  def destroy # free resources
      #...
  end

  #...

  def self.create(*args)
      instance = self.new(*args)
      begin
        yield instance
      ensure
        instance.destroy
      end
end

Foo.create do |foo|
  # use foo
end

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

Есть ли способ переопределить \ отключить new?

1 Ответ

0 голосов
/ 14 мая 2018

Это initialize метод, который должен быть сделан private:

class Foo
  @foo : String

  private def initialize(@foo)
  end

  def destroy
    puts "Destroying #{self}"
  end

  def self.create(arg)
    instance = new(arg)
    yield instance
  ensure
    instance.destroy if instance
  end
end

Foo.create("bar") do |foo| # will work
  p foo
end

Foo.new("bar")             # will raise

Детская площадка

...