<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • Ruby的method_missing

     

    用過ruby人對method_missing肯定不陌生,通常我們利用這一神技來實現調用不存在的方法,以便進行回調,利用它可以很方便的實現我們自己的DSL。

    在學習method_missing之前,先理解下ruby方法調用過程

    當ruby對象執行某一方法時,他需要找到這個方法,其查找流程如下:

    1、查詢當前對象的實例方法

    2、查找當前對象所有模塊,看是否有該方法

    3、查找該對象的父類及父類模塊(就是找他爹,他爹沒有,再找它爺。。。)

    4、如果這個對象很不幸沒爹,那就直接到Object中找

    5、到BasicObject中查找

    如果還沒找到,調用內核的method_missing方法,最終丟出NoMethodError

    由上可知,method_missing是方法調用的最后一道防線,我們可以把method_missing理解為“方法找不到時,該做什么”

    所以,我們可以在方法查詢的任何位置通過重寫method_missing的方式告訴ruby,“哥們,這方法如果沒找到,就這樣做。。。”

    一、方法代理

    方法代理使用的比較多的,通過method_missing讓當前對象使用另外一個類的方法 舉例:

    class A
      def do_this
        p "this is class A" 
      end
    end
    
    class B
      def initialize
        @proxy = A.new 
      end
    
      def method_missing(method_name, *args, &block) 
        p "this is class B"
        @proxy.do_this
      end 
    end
    
    b = B.new b.do_this

    b在查找do_this方法時,由于找不到,所以進入我們重寫的method_missing中,在這里我們 通過class的實例對象proxy來執行A中的do_this方法。

    二、編寫DSL

    通過上面的例子,可以知道method_missing可以對不存在的方法進行攔截,然后做我們想做 的事,這就為DSL的編寫提供了很大的便利,我們在method_missing中對我們要執行的方法 進行解析,判斷是不是滿足我們所定義的語法等等,然后進行我們需要的操作,很多自動化測試框架就是使用這種方式的,通過定義自己的DSL可以讓代碼更具業務化。

    posted @ 2022-05-10 00:41  阿拉懶神燈  閱讀(9)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看