私はあなたのユースケースを確信していませんが、スクリプトが終了する前に何かをやろうと思っています。もしそうなら、あなたの最善の策はおそらくシグナルトラップよりも簡単です。 Kernel
Module
は実際にはプログラムが実際に終了する直前に実行される#at_exit
メソッドを提供します。
使用法:(Kernel#at_exit
Docsから)
def do_at_exit(str1)
at_exit { print str1 }
end
at_exit { puts "cruel world" }
do_at_exit("goodbye ")
exit
は "生産:"
goodbye cruel world
をあなたは逆の順序で実行される複数のハンドラを定義することができます見ることができるようにプログラムは終了する。 Kernel
以来
は、あなたがObjectSpace.define_finalizer
を見てみることができます
より具体的な
Object
ベースの実装のためにさらに
p = People.new
p.send(:at_exit, &->{puts "We are leaving"})
# We are leaving
# The People have left
Object
仕様にも同様
class People
at_exit {puts "The #{self.name} have left"}
end
exit
# The People have left
あるいはインスタンス上を扱うことができるObject
に含まれています。使い方の
例:
class Person
def self.finalize(name)
proc {puts "Goodbye Cruel World -#{name}"}
end
def initialize(name)
@name = name
ObjectSpace.define_finalizer(self, self.class.finalize(@name))
end
end
使用法:
p = Person.new("engineersmnky")
exit
# Goodbye Cruel World -engineersmnky
Object
が同様に(一時的なオブジェクトのための素晴らしいではありませんガベージコレクションである場合、これは特に、あなたが起動します。このよう望むものではないかもしれません)しかし、アプリケーション全体に存在すべきオブジェクトがある場合、これはat_exitと同様に使用できます。Person
がgc'dましたが、プログラムがまだ終了していないため、例
# requiring WeakRef to allow garbage collection
# See: https://ruby-doc.org/stdlib-2.3.3/libdoc/weakref/rdoc/WeakRef.html
require 'weakref' #
p1 = Person.new("Engineer")
p2 = Person.new("Engineer's Monkey")
p2 = WeakRef.new(p2)
GC.start # just for this example
# Goodbye Cruel World -Engineer's Monkey
#=> nil
p2
#=> WeakRef::RefError: Invalid Reference - probably recycled
exit
# Goodbye Cruel World -Engineer
あなたがp2
のために定義されたファイナライザを見ることができるように解雇しました。 p1
のファイナライザは、アプリケーション全体で参照を保持していたため、終了するまで待っていました。
私はそれがファイルストリームの場合にのみ有効で、コンソールではないと信じています。 – gangelo