執行個體講解Ruby中的鉤子方法及對方法調用添加鉤子_ruby專題

來源:互聯網
上載者:User

鉤子方法有些類似事件驅動裝置,可以在特定的事件發生後執行特定的回呼函數,這個回呼函數就是鉤子方法(更形象的描述: 鉤子方法可以像鉤子一樣,勾住一個特定的事件。),在Rails中before\after函數就是最常見的鉤子方法。

Class#inherited方法也是這樣一個鉤子方法,當一個類被繼承時,Ruby會調用該方法。預設情況下,Class#inherited什麼都不做,但是通過繼承,我們可以攔截該事件,對感興趣的繼承事件作出回應。

class String  def self.inherited(subclass)    puts “#{self} was inherited by #{subclass}”  endendclass MyString < String; end
輸出:
String was inherited by MyString

通過使用鉤子方法,可以讓我們在Ruby的類或模組的生命週期中進行幹預,可以極大的提高編程的靈活性。

對方法調用添加鉤子的執行個體
ruby有很多有用的鉤子,如included,inhered,以及method_missing。對方法調用添加鉤子可以用alias環繞別名實現,但終歸有些麻煩,alias_method_chain需要定義with_feature方法也較麻煩,因此實現了下列module,include後調用method_callback :before_method,:after_method即可為before_method添加after_method鉤子

module AfterCall def self.included(base)  base.extend(ClassMethods) end module ClassMethods  def after_call when_call,then_call,*args_then,&block_then   alias_method "old_#{when_call}",when_call   define_method when_call do |*args_when,&block_when|    send "old_#{when_call}",*args_when,&block_when    send then_call,*args_then,&block_then   end  end endendclass Student include AfterCall def enter_class sb  puts "enter class #{sb}"  yield('before') if block_given? end private def after_enter_class pop  puts "after enter class #{pop}"  yield('after') if block_given? end protected def third_after  puts "from third enter" end after_call :after_enter_class ,:third_after after_call :enter_class ,:after_enter_class,"doubi", &lambda {|x|puts "from lambda #{x}"}endStudent.new.enter_class "1" do |x| puts "from lambda #{x}"end

運行結果如下:

#enter class 1#from lambda before#after enter class doubi#from lambda after#from third enter

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.