【问题标题】:Is there a way to destroy *self* after a class is instantiated? [duplicate]有没有办法在类被实例化后销毁 *self*? [复制]
【发布时间】:2012-11-01 00:42:50
【问题描述】:

可能重复:
Notification of object destruction in Ruby
Ruby: Destructors?

#initialize 在类被实例化时启动函数。只是想知道是否有 #uninitialize 函数。例如:

class Something
  def initialize
    @browser = Watir::Browser.new :chrome #opens browser
  end

  def stuff(url)
    @browser.goto url
  end

  def uninitalize
    @browser.quit #close browser
  end
end

s = Something.new
s.stuff("google.ca")

在这种情况下,浏览器将被初始化函数打开。有没有办法自动退出?

【问题讨论】:

  • 请参阅stackoverflow.com/questions/5956067/ruby-destructors,了解如何在 Ruby 中使用析构函数。
  • 如果您希望对象在内部处理所有内容而不是响应消息,为什么不将@browser.stuff(url); @browser.quit 直接放入#initialize?

标签: ruby destructor instantiation


【解决方案1】:

Ruby 终结器并不是真正的析构函数

虽然您可以为 Ruby 对象定义 finalizers,但它们本身并不是真正的析构函数。事实上,直到对象被销毁之后才会触发它们。文档说:

define_finalizer(obj, aProc=proc())
添加 aProc 作为终结器,在 obj 被销毁后调用。

重新考虑你的方法

与其使用#new 来实例化您的浏览器实例,不如考虑一个更像这样的模式:

class Something
  attr_accessor :browser

  def start_browser
  end

  def quit_browser
  end
end

s = Something.new
s.start_browser
s.quit_browser

其他模式也是可能的,包括在您的对象中设置回调或计时器。归根结底,关键是对象应该超出范围并被垃圾回收——它们实际上不能销毁自己。

【讨论】:

  • 谢谢,您有任何资源可以进一步详细说明这种方法吗?
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2022-09-27
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多