2014-03-26 44 views
3

我剛剛發現了我的ruby腳本的默認回調:at_exit - 這很酷。ruby​​腳本的默認回調是什麼?

我該如何找到像這樣的其他默認回調?我想如果我知道如何找到Ruby提供的所有默認回調函數,我可以編寫一些更靈活/強大的Ruby代碼。

+0

看一看內核模塊,它定義了'at_exit'方法:HTTP:// www.ruby-doc.org/core-2.1.1/Kernel.html。如果有什麼像這種方法,它必須在那裏定義。 – BroiSatse

回答

5

編輯在JörgW Mittag的評論中添加了一些更正。

他們更廣泛地被稱爲掛鉤(也許來自emacs lisp的影響)。此外at_exit,這是紅寶石掛鉤的名單,我認爲是全面的:

set_trace_func 
initialize 
method_missing 
singleton_method_added 
singleton_method_removed 
singleton_method_undefined 
respond_to_missing? 
extended 
included 
method_added 
method_removed 
method_undefined 
const_missing 
inherited 
intitialize_copy 
intitialize_clone 
intitialize_dup 
prepend 
append_features 
extend_features 
prepend_features 
+1

sawa是對的,我經常使用這些回調,根據我的情況,沒有任何失蹤。 –

+1

我認爲還有'prepended'類似於'extended'和'included'。另外,還有'append_features','extend_features'和'prepend_features',它們被'include','extend'和'prepend'調用並執行實際工作(因此可以用來定製mixin的工作方式),類似的初始化'被'new'調用。 –

+0

它們在哪裏(v.2.1):模塊 - > [append_features,const_missing,extended,included,method_added, method_removed,method_undefined,prepend_features,prepended];類 - > [繼承];對象 - > [respond_to_missing?]; BasicObject - > [method_missing,singleton_method_added,singleton_method_removed,singleton_method_undefined];內核 - > [at_exit,set_trace_func]。我不知道以下哪些方法(可以被任何類使用)記錄在哪裏 - > [initialize,intitialize_copy,intitialize_clone,intitialize_dup,extend_features]。 –

1

使用Ruby 2.0.0,TracePoint類會幫助你在這方面,非常具體的方式。它會告訴你到底是什麼的掛鉤被稱爲任何特定的一段代碼:

例子:

trace = TracePoint.new(:c_call) do |tp| 
    p [tp.lineno, tp.event, tp.defined_class,tp.method_id] 
end 

trace.enable do 
    class Foo # line num 6 
    def bar # line num 7 
     12 
    end 
    def self.baz # line num 10 
     13 
    end 
    end 
    Foo.new.bar # line num 14 
    Foo.baz 
end 
# >> [6, :c_call, Class, :inherited] 
# >> [7, :c_call, Module, :method_added] 
# >> [10, :c_call, BasicObject, :singleton_method_added] 
# >> [14, :c_call, Class, :new] 
# >> [14, :c_call, BasicObject, :initialize]