Notificação de destruição objeto em Ruby
-
03-07-2019 - |
Pergunta
Eu escrevi um modelo Rails personalizados. Este modelo é apoiado por um servidor realmente não por uma tabela de banco de dados (para que ele não herda de ActiveRecord::Base
). A fim de obter as informações solicitadas a partir do servidor eu abrir uma conexão SSH a ele. Porque trilhos não reutilização objeto um novo objeto, bem como uma nova conexão SSH para o servidor, será criado para o pedido já que é recebido. Para reduzir o estresse servidor Quero fechar a conexão SSH antes que o objeto modelo recebe lixo coletado. Eu estou querendo saber se ruby ??fornecer um mecanismo de notificação para informar o objeto que ele será destruído? Se assim eu poderia usar esta notificação para saber quando fechar as conexões SSH. Se eu não precisará fazê-lo manual quando eu sei que eu estou acabado com o objeto.
Se eu preciso tomar cuidado manualmente a isso, posso explicitamente destruir o objeto? Ou é o melhor que pode fazer é object = nil
?
Solução
Se você precisa controlar o que acontece quando um objeto é destruído, você realmente deve ser explicitamente destruí-la a si mesmo - isso é por design. Você não deveria ser capaz de destruir um objeto explicitamente ou -. Isto também é por design
Em outras palavras, a partir da perspectiva do seu programa, um objeto nunca é destruído ou destrutível. Por estas razões, você deve repensar o problema (isto não é uma necessidade incomum - liberação de recursos quando o objeto não é mais necessário) para que ele se encaixa no paradigma Rubi
.Definir o objeto a zero dá uma dica para o coletor de lixo, mas não destrói necessariamente imediatamente.
No entanto, se você deve ter a alça coletor de lixo, então continue a ler.
Não há suporte direto para um destruidor, mas você pode tê-lo chamar um finalizador função quando ele é destruído.
De acordo com a http://pleac.sourceforge.net/pleac_ruby/classesetc.html não pode ser recolhido o lixo, se ele contém uma referência ao objecto original, de modo que tem de ser um método de classe e não um método de instância.
class MyClass
def initialize
ObjectSpace.define_finalizer(self,
self.class.method(:finalize).to_proc)
end
def MyClass.finalize(id)
puts "Object #{id} dying at #{Time.new}"
end
end
Outras dicas
Eu postei uma solução aqui em outro segmento StackOverflow que implementa o Ruby de uma maneira que é semelhante a gerente de contexto do Python. Do lado do cliente, a destruição está implícita.