3

重複の可能性:
Rubyでのオブジェクト破壊の通知
Ruby:デストラクタ?

#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")

この場合、ブラウザは初期化機能によって開かれます。自動的に終了する方法はありますか?

4

1 に答える 1

0

Rubyファイナライザーは実際にはデストラクタではありません

Rubyオブジェクトのファイナライザーを定義することはできますが、実際にはデストラクタではありません。実際、オブジェクトが破棄されるまでトリガーされません。ドキュメントによると:

define_finalizer(obj、aProc = proc())
objが破棄された後に呼び出される、ファイナライザーとしてaProcを追加します。

あなたのアプローチを再考する

ブラウザインスタンスを#newでインスタンス化するのではなく、次のようなパターンを検討してください。

class Something
  attr_accessor :browser

  def start_browser
  end

  def quit_browser
  end
end

s = Something.new
s.start_browser
s.quit_browser

オブジェクト内でのコールバックやタイマーの設定など、他のパターンも可能です。最終的に重要なのは、オブジェクトはスコープ外になり、ガベージコレクションされる必要があるということです---実際にオブジェクトを破棄することはできません。

于 2012-10-31T16:32:49.163 に答える