国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > Ruby > 正文

ruby元編程之創(chuàng)建自己的動態(tài)方法

2020-10-29 19:38:41
字體:
供稿:網(wǎng)友

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

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

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

示例

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

復制代碼 代碼如下:

class Legislator
  #假設(shè)這是一個真實的實現(xiàn)
  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

那么這個時候調(diào)用

復制代碼 代碼如下:

Legislator.respond_to?(:find_by_first_name) 

將會提示錯誤,那么繼續(xù)

復制代碼 代碼如下:

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?需要兩個參數(shù),如果,你沒有提供將會產(chǎn)生ArgumentError。

相關(guān)反射 DRY

如果我們注意到了這里有重復的代碼。我們可以參考ActiveRecord的實現(xiàn)封裝在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的時候,發(fā)送 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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
天堂资源在线中文| 亚洲精品天堂在线观看| 日本在线视频www鲁啊鲁| 在线黄色国产电影| 天天干天天摸| 精品中文字幕不卡在线视频| 交换国产精品视频一区| 国产一二三在线观看| 国产不卡一卡2卡三卡4卡5卡在线| 欧洲亚洲精品视频| 免费黄网站在线观看| 丁香花在线电影| 精精国产xxxx视频在线| 白浆爆出在线观看| 国产精品国精产品一二| 国产天堂av| 免费av不卡在线观看| 国产视频你懂的| 午夜羞羞小视频在线观看| 精品入口麻豆传煤| 国产二级片在线| 精精国产xxxx视频在线中文版 | 国产成在线观看免费视频| 丁香视频五月| 国产成人精品男人的天堂538| 国产精品麻豆一区二区三区| 国产美女av| 日本片在线看| 在线观看免费视频一区二区三区| 国产美女在线一区二区三区| 国产啊啊啊视频在线观看| 国产在线资源| 久热久精久品这里在线观看| 亚洲大香人伊一本线| 国产精品你懂的在线观看| 国产美女av| 狠狠色丁香婷婷| 美女国产在线| 国产在线观看色| 国产乱在线观看视频| 狠狠操视频网站| 激情在线视频播放| 国产中文字幕在线视频| 国产乱子视频| 中文字幕视频在线| 国产污视频在线| 国产系列在线观看| 国产三级在线免费观看| 国产黄网站在线观看| 2020亚洲男人天堂| 亚洲天堂影院在线观看| av网址在线播放| 欧美成人亚洲高清在线观看| 久久精品最新免费国产成人| 国产卡1卡2卡三卡在线| 国产一级免费黄色片| 91黄色在线| 亚洲天堂二区| 丁香在线视频| aaa大片在线观看| www在线视频| 国产视频xxx| gogo高清在线播放免费| 成在在线免费视频| av高清资源| 天天操天天是| 中文字幕av在线播放| www.蜜桃av| 国产超碰在线| 天堂资源在线中文| 夜色资源网av在先锋网站观看| 欧美成人亚洲高清在线观看| 高清欧美精品xxxxx在线看| 国产成人夜间影院在线观看| 四虎中文字幕| 91在线超碰| 国产一级黄色电影| 四虎精品成人a在线观看| 91超碰国产在线| 欧美高清xxxx性| 尤物在线精品视频| 中文字幕网在线| 毛片网站在线观看| 在线观看视频污| 国产黄色在线播放| 国产一级免费| 丁香花在线电影| 免费精品国产自产拍在| 天天插天天色| av在线免费观看网| av男人的天堂网| 精品卡一卡卡2卡3网站| 国产亚洲精品自在线观看| 激情网站在线| 国内自拍视频在线观看| 嫩草在线播放| www.操操操.com| 四虎国产精品永久地址998| 在线中文字幕视频| 精品麻豆视频| 永久免费网站在线| 性网站在线看| 日本高清中文字幕| 久艹在线视频| 国产另类图片| 国产精品免费视频二三区| 国产极品美女到高潮| 91看片在线观看| 亚洲国产日韩在线人成电影| 啪啪免费视频一区| 超碰在线国产| 最近高清中文在线字幕在线观看| 91看片在线观看| 中文字幕不卡| 最近中文字幕mv免费高清视频8| 青草在线视频在线观看| 亚洲视频在线观看不卡| a视频免费看| 免费特级黄毛片| 国产在线资源| 国产黄色片在线观看| 亚洲精品少妇久久久久久| 日本三级在线视频| 国产美女极品在线| 国产成在线观看免费视频| 日本h视频在线观看| 国产鲁鲁视频在线观看免费| 国产午夜视频| 亚洲综合在线不卡| 国产另类图片| 天天艹天天操| 国产超碰在线| 最近中文字幕mv2018在线高清| 精精国产xxxx视频在线动漫 | 欧美日韩一区二区三区视视频| eeuss影院在线| 黄色av免费看| 小说区乱图片区| 国产野外战在线播放| 日本调教视频在线观看| 日本中文字幕在线视频| 日本在线视频www鲁啊鲁| 国产精品福利视频一区二区三区| av日韩国产| 国产精品入口麻豆免费看| 全网国产福利在线播放| 国产视频三区| 99热在线免费观看| 久久久久久久久免费视频| 中文av资源在线| 国产美女视频一区二区三区| 樱花草在线观看www| 国产成人天天5g影院| 国产色在线 com| 国产中文第一页| 国产69精品久久app免费版 | 在线视频三级| 二人午夜免费观看在线视频| 香蕉视频网站在线观看| 亚洲欧美精选| а√资源新版在线天堂| 夜色资源网av在先锋网站观看| 9色在线视频网站| 国产午夜精品一区理论片| 日本调教视频在线观看| 亚洲国产日韩在线人成电影| 伊人永久在线| а天堂8中文最新版在线官网| 在线视频1区2区| 国产成人精品实拍在线| 精品福利视频导航大全| 精灵使的剑舞无删减版在线观看| 国产精品久久精品牛牛影视| 国产一二三视频| 中文字幕在线播放网址| 国产色在线 com| 国产变态拳头交视频一区二区 | 国产色婷婷在线| 国产亚洲精品久久久久久移动网络| 超碰在线网址| 国产中文字幕在线| 99热最新网址| 国产黄色片在线播放| 99久久99热久久精品免费看| а√资源新版在线天堂| 国产乱妇乱子在线播视频播放网站| 丁香花视频在线观看| 1区2区视频| av在线免费播放| 国产色在线观看| 亚洲精品手机在线| 五月天亚洲激情| 亚洲天堂久久久| 国产视频一二区| 欧洲有码在线视频| 综合蜜桃精品| 爱福利在线视频| 精品成人免费自拍视频| 午夜av在线免费观看| xxxxx中文字幕|