婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > ruby元編程之創建自己的動態方法

ruby元編程之創建自己的動態方法

熱門標簽:常德電銷平臺外呼系統軟件價格 高德地圖標注客服 白銀外呼paas系統 電銷機器人廠商代理 百度地圖標注自定義圖片 滴滴外呼系統 地圖標注賺錢項目注冊 徐州網絡外呼系統哪個好 湖州u友防封電銷卡

method_missing是Ruby元編程(metaprogramming)常用的手法。基本思想是通過實現調用不存在的方法,以便進行回調。典型的例子是:ActiveRecord的動態查找(dynamic finder)。例如:我們有email屬性那么就可以調用User.find_by_email('joe@example.com'),雖然, ActiveRecord::Base并沒有一個叫做find_by_email的方法。

respond_to? 并不如method_missing出名,常用在當需要確認一個回饋對象需要確認,以便不會因為沒有反饋對象,而導致后面的調用出現錯誤。

下面是一個應用這兩者的例子:

示例

我們有類Legislator class,現在,想要給它加一個find_by_first_name('John')的動態調用。實現find(:first_name => 'John')的功能。

復制代碼 代碼如下:

class Legislator
  #假設這是一個真實的實現
  def find(conditions = {})
  end
 
  #在本身定義畢竟這是他的方法
  def self.method_missing(method_sym, *arguments, block)
    # the first argument is a Symbol, so you need to_s it if you want to pattern match
    if method_sym.to_s =~ /^find_by_(.*)$/
      find($1.to_sym => arguments.first)
    else
      super
    end
  end
end

那么這個時候調用

復制代碼 代碼如下:

Legislator.respond_to?(:find_by_first_name) 

將會提示錯誤,那么繼續

復制代碼 代碼如下:

class Legislator
  # 省略
 
  # It's important to know Object defines respond_to to take two parameters: the method to check, and whether to include private methods
  # http://www.ruby-doc.org/core/classes/Object.html#M000333
  def self.respond_to?(method_sym, include_private = false)
    if method_sym.to_s =~ /^find_by_(.*)$/
      true
    else
      super
    end
  end
end

正如代碼注釋所述respond_to?需要兩個參數,如果,你沒有提供將會產生ArgumentError。

相關反射 DRY

如果我們注意到了這里有重復的代碼。我們可以參考ActiveRecord的實現封裝在ActiveRecord::DynamicFinderMatch,以便避免在method_missing和respond_to?中重復。

復制代碼 代碼如下:

class LegislatorDynamicFinderMatch
  attr_accessor :attribute
  def initialize(method_sym)
    if method_sym.to_s =~ /^find_by_(.*)$/
      @attribute = $1.to_sym
    end
  end
 
  def match?
    @attribute != nil
  end
end

class Legislator
  def self.method_missing(method_sym, *arguments, block)
    match = LegislatorDynamicFinderMatch.new(method_sym)
    if match.match?
      find(match.attribute => arguments.first)
    else
      super
    end
  end

  def self.respond_to?(method_sym, include_private = false)
    if LegislatorDynamicFinderMatch.new(method_sym).match?
      true
    else
      super
    end
  end
end

緩存 method_missing

重復多次的method_missing可以考慮緩存。

另外一個我們可以向ActiveRecord 學習的是,當定義method_missing的時候,發送 now-defined方法。如下:

復制代碼 代碼如下:

class Legislator   
  def self.method_missing(method_sym, *arguments, block)
    match = LegislatorDynamicFinderMatch.new(method_sym)
    if match.match?
      define_dynamic_finder(method_sym, match.attribute)
      send(method_sym, arguments.first)
    else
      super
    end
  end
 
  protected
 
  def self.define_dynamic_finder(finder, attribute)
    class_eval -RUBY
      def self.#{finder}(#{attribute})        # def self.find_by_first_name(first_name)
        find(:#{attribute} => #{attribute})   #   find(:first_name => first_name)
      end                                     # end
    RUBY
  end
end

測試

測試部分如下:

復制代碼 代碼如下:

describe LegislatorDynamicFinderMatch do
  describe 'find_by_first_name' do
    before do
      @match = LegislatorDynamicFinderMatch.new(:find_by_first_name)
    end
     
    it 'should have attribute :first_name' do
      @match.attribute.should == :first_name
    end
   
    it 'should be a match' do
      @match.should be_a_match
    end
  end
 
  describe 'zomg' do
    before do
      @match = LegislatorDynamicFinderMatch(:zomg)
    end
   
    it 'should have nil attribute' do
      @match.attribute.should be_nil
    end
   
    it 'should not be a match' do
      @match.should_not be_a_match
    end
  end
end

下面是 RSpec 例子:

復制代碼 代碼如下:

describe Legislator, 'dynamic find_by_first_name' do 
  it 'should call find(:first_name => first_name)' do 
    Legislator.should_receive(:find).with(:first_name => 'John') 
     
    Legislator.find_by_first_name('John') 
  end 
end

您可能感興趣的文章:
  • Ruby元編程的一些值得注意的地方
  • ruby元編程之method_missing的一個使用細節
  • Ruby元編程之夢中情人method_missing方法詳解
  • Ruby元編程技術詳解(Ruby Metaprogramming techniques)
  • Ruby元編程小結
  • Ruby和元編程之萬物皆為對象
  • ruby元編程實際使用實例
  • Ruby元編程基礎學習筆記整理

標簽:公主嶺 荊門 普洱 永州 三沙 張家界 梧州 遼寧

巨人網絡通訊聲明:本文標題《ruby元編程之創建自己的動態方法》,本文關鍵詞  ruby,元,編程,之,創建,自己的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《ruby元編程之創建自己的動態方法》相關的同類信息!
  • 本頁收集關于ruby元編程之創建自己的動態方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    99久久精品免费看| 成人免费视频免费观看| 亚洲欧美精品午睡沙发| 亚洲欧美激情视频在线观看一区二区三区 | 欧美主播一区二区三区美女| 欧美性淫爽ww久久久久无| 日韩西西人体444www| 国产精品欧美久久久久无广告 | 色狠狠一区二区| 欧美日本乱大交xxxxx| 久久久www免费人成精品| 亚洲蜜臀av乱码久久精品| 日韩电影在线免费看| 国产成人av电影| 91精品在线麻豆| 亚洲视频一区二区免费在线观看 | 欧美日韩久久久一区| 久久久久久99久久久精品网站| 亚洲九九爱视频| 国产一区二区三区香蕉| 欧美亚洲另类激情小说| 国产精品免费av| 精品亚洲免费视频| 欧美日韩在线一区二区| 国产精品国产三级国产aⅴ入口| 美女视频免费一区| 精品少妇一区二区三区视频免付费 | 欧美夫妻性生活| 国产精品久久午夜| 毛片av一区二区| 制服丝袜国产精品| 亚洲一区二区三区四区不卡| 国产精品综合久久| 91精品国产乱| 亚洲一区中文日韩| av在线免费不卡| 精品日韩一区二区| 天天综合天天做天天综合| 久久电影网电视剧免费观看| 国产剧情一区在线| 在线成人午夜影院| 亚洲精品中文字幕乱码三区| 国产精品亚洲视频| 精品国产伦一区二区三区观看体验| 亚洲一区二区三区四区在线免费观看 | 欧美日韩中文字幕一区| 国产精品网站在线播放| 国产综合色产在线精品| 日韩限制级电影在线观看| 精品国产一区久久| 亚洲高清在线精品| 免费人成网站在线观看欧美高清| 91传媒视频在线播放| 激情文学综合网| 成人av电影观看| 国产最新精品免费| 久久久欧美精品sm网站| 精品一区二区在线看| 精品久久久久久久久久久久久久久| 国产精品视频一二三| 91亚洲国产成人精品一区二三| 久久久国产精品麻豆| 粉嫩一区二区三区性色av| 欧美成人aa大片| 国产精品综合在线视频| 国产日韩欧美麻豆| 成人a级免费电影| 亚洲日本在线天堂| 在线观看成人小视频| 一级特黄大欧美久久久| 色婷婷久久久久swag精品| 一区二区中文字幕在线| 在线免费观看日韩欧美| 亚洲h精品动漫在线观看| 欧美日韩精品一区二区三区蜜桃 | 国产伦精品一区二区三区免费迷 | 国产精选一区二区三区| 欧美国产在线观看| 99re这里只有精品首页| 亚洲欧美另类图片小说| 欧美日韩一区高清| 国产麻豆日韩欧美久久| 亚洲视频 欧洲视频| 欧美日本韩国一区二区三区视频| 麻豆91精品91久久久的内涵| 国产精品无遮挡| 欧美日韩在线不卡| 国产在线不卡一卡二卡三卡四卡| 国产精品美女www爽爽爽| 在线区一区二视频| 捆绑变态av一区二区三区| 国产精品短视频| 3atv一区二区三区| 成人激情免费网站| 五月激情综合色| 国产欧美一区二区三区在线老狼| 日本韩国一区二区三区| 久久99精品国产麻豆不卡| 亚洲欧美二区三区| 久久精品男人的天堂| 欧美日韩免费观看一区二区三区| 国产精品综合二区| 日日欢夜夜爽一区| 亚洲欧美另类综合偷拍| 久久久久久久电影| 91精品国产色综合久久ai换脸| 99久久国产免费看| 国产精品538一区二区在线| 亚洲va欧美va天堂v国产综合| 国产亚洲人成网站| 制服.丝袜.亚洲.中文.综合| 波多野结衣亚洲| 精品一区二区在线视频| 天天影视涩香欲综合网| 中文字幕一区二区不卡| 久久久久久久电影| 精品国一区二区三区| 欧美久久婷婷综合色| 一本一道波多野结衣一区二区| 国产精品996| 欧美精选一区二区| a级精品国产片在线观看| 国内精品免费在线观看| 日本vs亚洲vs韩国一区三区二区| 一二三区精品视频| 亚洲人成人一区二区在线观看| 久久精品免费在线观看| 欧美变态凌虐bdsm| 欧美一区二区三区视频在线观看 | 一区二区三区在线观看动漫| 久久久美女毛片| 精品乱人伦小说| 欧美一区二区国产| 欧美私人免费视频| 色激情天天射综合网| 色94色欧美sute亚洲13| 色综合久久久久综合| 91在线小视频| 99久久er热在这里只有精品66| 波多野结衣中文一区| 国产91精品免费| 懂色av一区二区三区蜜臀| 久色婷婷小香蕉久久| 日本人妖一区二区| 美国一区二区三区在线播放| 日韩国产高清影视| 免费成人你懂的| 美国十次了思思久久精品导航| 久久精品国产亚洲a| 国产在线一区二区| 成人开心网精品视频| 99久久精品免费看国产| 91麻豆精东视频| 欧美日韩精品高清| 日韩精品一区二区三区在线观看| 在线不卡欧美精品一区二区三区| 欧美一区日韩一区| 欧美电视剧免费观看| 国产日韩影视精品| 1000部国产精品成人观看| 亚洲欧洲www| 亚洲精品国产精华液| 亚洲精品视频一区| 亚洲一区二区不卡免费| 日精品一区二区三区| 国产精一品亚洲二区在线视频| av中文字幕不卡| 欧美精品在线观看一区二区| 日韩精品专区在线影院观看| 国产农村妇女精品| 亚洲精品成a人| 免费高清不卡av| 国产成人自拍高清视频在线免费播放| av电影在线观看不卡| 欧美亚洲国产怡红院影院| 91精品一区二区三区在线观看| 久久精品亚洲精品国产欧美| 一区二区三区高清在线| 日韩亚洲欧美在线| 中文字幕一区日韩精品欧美| 亚洲国产三级在线| 国内精品嫩模私拍在线| 欧美亚一区二区| 国产欧美日韩精品在线| 亚洲第一久久影院| 成人丝袜视频网| 91精品欧美久久久久久动漫 | 成人h精品动漫一区二区三区| 精品视频一区三区九区| 国产欧美精品区一区二区三区 | 夜夜精品浪潮av一区二区三区| 蜜桃视频在线一区| 色综合久久中文综合久久97| 日韩视频免费观看高清在线视频| 亚洲天堂a在线| 国产一区二区三区观看| 欧美美女网站色| 亚洲日本一区二区三区| 激情五月婷婷综合| 91精品国产aⅴ一区二区|