亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > Ruby元編程之夢(mèng)中情人method_missing方法詳解

Ruby元編程之夢(mèng)中情人method_missing方法詳解

熱門(mén)標(biāo)簽:常德電銷(xiāo)平臺(tái)外呼系統(tǒng)軟件價(jià)格 湖州u友防封電銷(xiāo)卡 地圖標(biāo)注賺錢(qián)項(xiàng)目注冊(cè) 白銀外呼paas系統(tǒng) 滴滴外呼系統(tǒng) 徐州網(wǎng)絡(luò)外呼系統(tǒng)哪個(gè)好 百度地圖標(biāo)注自定義圖片 高德地圖標(biāo)注客服 電銷(xiāo)機(jī)器人廠商代理

我最近讀了些文章(比如這篇),宣傳在 Ruby 里使用 method_missing 的。

很多人都與 method_missing 干柴烈火,但在并沒(méi)有小心處理彼此之間的關(guān)系。所以,我想來(lái)探討一下這個(gè)問(wèn)題:

** 我該怎么用 method_missing **

什么時(shí)候該抵擋 method_missing 的誘惑

首先,永遠(yuǎn)不要在還沒(méi)花時(shí)間考慮你用得夠不夠好之前,就向 method_missing 的魅力屈服。你知道,在日常生活中,很少會(huì)讓你以為的那樣亟需 method_missing:

日常:方法代理

案例:我需要讓這個(gè)類能夠使用另一個(gè)類的方法

這是我所見(jiàn)過(guò)最普遍的使用 method_missing 的情況。這在 gems 與 Rails 插件里頭尤其流行。它的模型類似這樣:

復(fù)制代碼 代碼如下:

class A
  def hi
    puts "Hi from #{self.class}"
  end
end

class B
  def initialize
    @b = A.new
  end

  def method_missing(method_name, *args, block)
    @b.send(method_name, *args, block)
  end
end

A.new.hi #=> Hi from A
B.new.hi #=> Hi from A


如此,B 就擁有了 A 的所有實(shí)例方法。但是讓我們想想,在調(diào)用 @b.hi 的時(shí)候都發(fā)生了什么。你的 ruby 環(huán)境沿著繼承鏈一路找 hi 這個(gè)方法,到最后,恰恰在丟出個(gè) NoMethodError 前,它調(diào)了 method_missing 這個(gè)方法。

在上例中,情況并不壞,畢竟這里就兩個(gè)微不足道的類需要查。但通常,我們是在 Rails 或者其他一些框架的上下文中編程。而你的 Rails 模型繼承自 ActiveRecord,而它又集成自其他一大坨的類,于是現(xiàn)在你就有了一坨高高的堆棧要爬⋯⋯ 在你每次調(diào)用 @b.hi 的時(shí)候!

你的好基友:define_method

估計(jì)現(xiàn)在你在抱怨,“但是史蒂夫,我需要 method_missing” 我告訴你,別忘了其實(shí)除了情婦之外,你還有個(gè)忠誠(chéng)的好基友,叫做 define_method。

它允許你動(dòng)態(tài)地定義一個(gè)方法(顧名思義)。它的偉大之處在于,在它執(zhí)行過(guò)之后(通常在你的類們加載之后),這些方法就存在你的類中了,簡(jiǎn)單直接。在你創(chuàng)建這些方法的時(shí)候,也沒(méi)有什么繼承鏈需要爬。

define_method 很有愛(ài)很可靠,并且能夠滿足你的日常生活。不信我?接著看⋯⋯

復(fù)制代碼 代碼如下:

class B
  define_method(:hi) do
    @b.hi
  end
end

“可是我有一大坨方法要定義!” 你抱怨

“沒(méi)問(wèn)題!” 我賣(mài)萌眨眼

復(fù)制代碼 代碼如下:

class B
  [:hi, :bye, :achoo, :gesundheit].each do |name|
    define_method(name) do
      @b.send(name)
    end
  end
end

可是我懶得把它們一個(gè)個(gè)寫(xiě)出來(lái)!

你有點(diǎn)難搞哦

復(fù)制代碼 代碼如下:

class A
  # ... lots of methods in here
end
class B
  A.instance_methods.each do |name|
    define_method(name) do
      @b.send(name)
    end
  end
end

那假如我要定義的方法跟原本的有那么一些些不一樣呢?

容易

復(fù)制代碼 代碼如下:

class A
  def hi
    puts "Hi."
  end
end

class B
  A.instance_methods.each do |name|
    define_method("what_is_#{name}") do
      if @b.respond_to?(name)
        @b.send(name)
      else
        false
      end
    end
  end
end

B.new.what_is_hi #=> "Hi."
B.new.what_is_wtf #=> false


呃,代碼看起來(lái)不優(yōu)雅啊

那就沒(méi)辦法了,湊合得了。如果你想要代碼更易讀,可以看看我們的ruby delegation library 和 Rails ActiveRecord delegation。

好,我們總結(jié)一下,看看 define_method 的真正威力。

修改自 ruby-doc.org 上的 例子

復(fù)制代碼 代碼如下:

class A
  def fred
    puts "In Fred"
  end
  def create_method(name, block)
    self.class.send(:define_method, name, block)
  end
  define_method(:wilma) { puts "Charge it!" }
end
class B A
  define_method(:barney, instance_method(:fred))
end

a = B.new
a.barney                                #=> In Fred
a.wilma                                 #=> Charge it!
a.create_method(:betty) { p self.to_s }
a.betty                                 #=> B


什么時(shí)候用 method_missing?

現(xiàn)在你估計(jì)在想,總有該用它的時(shí)候吧,不然還要它干嘛?沒(méi)錯(cuò)。

動(dòng)態(tài)命名的方法(又名,元方法)

案例:我要依據(jù)某種模式提供一組方法。這些方法做的事情顧名思義。我可能從來(lái)沒(méi)有調(diào)用過(guò)這些可能的方法,但是等我要用的時(shí)候,它們必須可用。

現(xiàn)在才是人話!這其實(shí)正是 ActiveRecord 所采用的方式,為你提供那些基于屬性的動(dòng)態(tài)構(gòu)建的查找方法,比如 find_by_login_and_email(user_login, user_email)。

復(fù)制代碼 代碼如下:

def method_missing(method_id, *arguments, block)
  if match = DynamicFinderMatch.match(method_id)
    attribute_names = match.attribute_names
    super unless all_attributes_exists?(attribute_names)
    if match.finder?
      # ...you get the point
    end # my OCD makes me unable to omit this
    # ...
  else
    super # this is important, I'll tell you why in a second
  end
end

權(quán)衡利弊

當(dāng)你有一大堆元方法要定義,又不一定用得到的時(shí)候,method_missing 是個(gè)完美的折衷。

想想 ActiveRecord 中基于屬性的查找方法。要用 define_method 從頭到腳定義這些方法,ActiveRecord 需要檢查每個(gè)模型的表中所有的字段,并為每個(gè)可能的字段組合方式都定義方法。

復(fù)制代碼 代碼如下:

find_by_email
find_by_login
find_by_name
find_by_id
find_by_email_and_login
find_by_email_and_login_and_name
find_by_email_and_name
# ...

假如你的模型有 10 個(gè)字段,那就是 10! (362880)個(gè)查找方法需要定義。想象一下,在你的 Rails 項(xiàng)目跑起來(lái)的時(shí)候,有這么多個(gè)方法需要一次定義掉,而 ruby 環(huán)境還得把它們都放在內(nèi)存里頭。

老虎·伍茲都做不來(lái)的事情。

** 正確的 method_missing 使用方式

(譯者猥瑣地注:要回家了,以下簡(jiǎn)要摘譯)

1、先檢查

并不是每次調(diào)用都要處理的,你應(yīng)該先檢查一下這次調(diào)用是否符合你需要添加的元方法的模式:

復(fù)制代碼 代碼如下:

def method_missing(method_id, *arguments, block)
  if method_id.to_s =~ /^what_is_[\w]+/
    # do your thing
  end
end

2、包起來(lái)

檢查好了,確實(shí)要處理的,請(qǐng)記得把函數(shù)體包在你的好基友,define_method 里面。如此,下次就不用找情婦了:

復(fù)制代碼 代碼如下:

def method_missing(method_id, *arguments, block)
  if method_id.to_s =~ /^what_is_[\w]+/
    self.class.send :define_method, method_id do
      # do your thing
    end
    self.send(method_id)
  end
end

3、擦屁股

自己處理不來(lái)的方法,可能父類有辦法,所以 super 一下:

復(fù)制代碼 代碼如下:

def method_missing(method_id, *arguments, block)
  if method_id.to_s =~ /^what_is_[\w]+/
    self.class.send :define_method, method_id do
      # do your thing
    end
    self.send(method_id)
  else
    super
  end
end

4、昭告天下

復(fù)制代碼 代碼如下:

def respond_to?(method_id, include_private = false)
  if method_id.to_s =~ /^what_is_[\w]+/
    true
  else
    super
  end
end

要告訴別人,你的類雖然暫時(shí)還沒(méi)有這個(gè)方法,但是其實(shí)是能夠響應(yīng)這方法的。

** 總結(jié) **

在每個(gè) Ruby 程序員的生活中,這仨方法扮演了重要的角色。define_method 是你的好基友,method_missing 是個(gè)如膠似漆但也需相敬如賓的情婦,而 respond_to? 則是你的愛(ài)子,如此無(wú)虞。

您可能感興趣的文章:
  • Ruby元編程的一些值得注意的地方
  • ruby元編程之創(chuàng)建自己的動(dòng)態(tài)方法
  • ruby元編程之method_missing的一個(gè)使用細(xì)節(jié)
  • Ruby元編程技術(shù)詳解(Ruby Metaprogramming techniques)
  • Ruby元編程小結(jié)
  • Ruby和元編程之萬(wàn)物皆為對(duì)象
  • ruby元編程實(shí)際使用實(shí)例
  • Ruby元編程基礎(chǔ)學(xué)習(xí)筆記整理

標(biāo)簽:張家界 梧州 公主嶺 荊門(mén) 三沙 普洱 永州 遼寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Ruby元編程之夢(mèng)中情人method_missing方法詳解》,本文關(guān)鍵詞  Ruby,元,編程,之,夢(mèng)中,情人,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Ruby元編程之夢(mèng)中情人method_missing方法詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Ruby元編程之夢(mèng)中情人method_missing方法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    久久精品免视看国产明星| 国产亚洲精品aaa大片| 日韩中文字幕在线亚洲一区| 国产视频久久久| 国产一区二区精品久| 九九久久99综合一区二区| 91麻豆精品国产自产在线观看一区| 97视频免费在线观看| 一级片免费在线观看视频| 亚洲wwwwww| 日韩欧美一及在线播放| 日韩中文字幕在线观看视频| 成人高清视频在线观看| 九九九在线视频| 亚欧成人毛片一区二区三区四区| 香蕉视频久久| 国产美女在线一区二区三区| 中文字幕一区二区三区精彩视频 | 成人免费高清视频| 精品国产三级a| 中文字幕一区二区三区精彩视频 | 欧美a级成人淫片免费看| 成人影院一区二区三区| 国产极品白嫩美女在线观看看| 久草免费资源| 天天色色网| 欧美电影免费看大全| 精品久久久久久免费影院| 国产精品1024永久免费视频 | 欧美国产日韩在线| 国产视频久久久| 日韩欧美一及在线播放| 国产视频一区二区在线播放| a级毛片免费全部播放| 免费毛片播放| 国产一区二区精品久| 精品视频在线观看一区二区三区| 国产不卡在线观看| 精品视频在线观看视频免费视频| 美国一区二区三区| 九九精品影院| 国产视频一区二区三区四区| 天天做人人爱夜夜爽2020毛片| 韩国三级香港三级日本三级| 天天做人人爱夜夜爽2020毛片| 精品久久久久久综合网| 99色精品| 一级毛片视频免费| 欧美国产日韩精品| 国产不卡在线看| 精品国产一区二区三区久久久狼 | 色综合久久久久综合体桃花网| 台湾毛片| 国产成a人片在线观看视频| 青青青草影院 | 尤物视频网站在线观看| 91麻豆精品国产自产在线观看一区| 日韩专区亚洲综合久久| 夜夜操网| 九九久久国产精品| 日本乱中文字幕系列| 国产成人精品综合| 日本免费区| 国产国语对白一级毛片| 国产成a人片在线观看视频| 99久久精品国产国产毛片| 国产不卡高清在线观看视频| 91麻豆国产| 中文字幕Aⅴ资源网| 中文字幕一区二区三区精彩视频 | 日韩专区亚洲综合久久| 国产视频网站在线观看| 成人av在线播放| 麻豆系列 在线视频| 久久久成人网| 国产91精品一区| 成人高清免费| 天堂网中文字幕| 国产精品1024永久免费视频 | 国产一区二区精品| 可以免费看毛片的网站| 夜夜操网| 一级女性大黄生活片免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 91麻豆精品国产自产在线| 黄视频网站在线观看| 日韩在线观看视频网站| 久久精品店| 天堂网中文字幕| 欧美大片a一级毛片视频| 青草国产在线| 日本伦理片网站| 欧美a免费| 国产成人精品综合在线| 欧美国产日韩一区二区三区| 午夜在线亚洲| 日日夜人人澡人人澡人人看免| 国产高清在线精品一区a| 日韩av东京社区男人的天堂| 天天做人人爱夜夜爽2020毛片| 日本伦理网站| 国产激情视频在线观看| 国产综合91天堂亚洲国产| 欧美激情一区二区三区中文字幕| 91麻豆精品国产自产在线观看一区 | a级毛片免费观看网站| 韩国三级香港三级日本三级la| 黄视频网站在线观看| 色综合久久天天综线观看| 欧美一区二区三区性| 精品在线观看一区| 毛片的网站| 高清一级片| 日日夜人人澡人人澡人人看免| 黄色短视屏| 国产精品1024永久免费视频 | 香蕉视频亚洲一级| 日韩专区第一页| 国产视频久久久| 国产成人啪精品视频免费软件| 成人a级高清视频在线观看| 精品国产三级a| 青青久久精品| 亚洲第一色在线| 成人a级高清视频在线观看| 国产高清视频免费| 日韩av片免费播放| 日日夜人人澡人人澡人人看免| 韩国毛片免费大片| 天天做人人爱夜夜爽2020毛片| 日本伦理网站| 欧美一区二区三区性| 国产国产人免费视频成69堂| 欧美另类videosbestsex视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 韩国毛片 免费| 中文字幕97| 一a一级片| 国产精品免费久久| 久久久久久久久综合影视网| 亚洲精品久久久中文字| 四虎论坛| 成人高清视频免费观看| 午夜家庭影院| 午夜欧美福利| 欧美18性精品| 九九精品久久久久久久久| 成人a级高清视频在线观看| 久久精品成人一区二区三区| 色综合久久天天综合绕观看| 日韩av成人| 成人免费网站久久久| 色综合久久天天综合| 一本伊大人香蕉高清在线观看| 亚洲天堂一区二区三区四区| 亚洲wwwwww| 一级女人毛片人一女人| 欧美1区| 四虎影视久久久免费| 日韩字幕在线| 黄色福利片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产伦精品一区二区三区在线观看| 成人免费网站久久久| 亚洲精品影院久久久久久| 国产视频一区在线| 九九热国产视频| 日韩女人做爰大片| 精品在线视频播放| 免费国产在线视频| a级毛片免费观看网站| 亚欧视频在线| 日韩欧美一及在线播放| 日日夜人人澡人人澡人人看免| 国产精品12| 欧美日本韩国| 久久福利影视| 日本特黄特黄aaaaa大片| 国产原创视频在线| 国产麻豆精品视频| 亚欧视频在线| 精品国产三级a| 台湾美女古装一级毛片| 香蕉视频亚洲一级| 国产不卡在线播放| 99热热久久| 亚洲不卡一区二区三区在线| 一级片免费在线观看视频| 色综合久久天天综合| 国产麻豆精品| 可以免费看毛片的网站| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品视频一区二区三区免费| 九九九国产| 日韩免费片| 一级女人毛片人一女人| 欧美一区二区三区性| 精品久久久久久中文字幕一区| 可以免费看毛片的网站| 久久精品店|