《Ruby 元編程》讀書筆記三:方法

動(dòng)態(tài)方法

????????目的:消除重復(fù)的代碼。

①動(dòng)態(tài)調(diào)用方法

? ? ? ? 調(diào)用方法時(shí)草穆,通常使用(·)裆操,也可以使用Object#send方法代替點(diǎn)標(biāo)識(shí)符來調(diào)用MyClass#my_method方法窗宇。

? ? ? ? 使用send方法仍然調(diào)用了my_method方法厌处,但send方法的第一個(gè)參數(shù)是你要發(fā)送給對(duì)象的消息,也就是方法的名字凝危。

? ? ? ? 像這樣波俄,將調(diào)用的方法名作為參數(shù),這樣就可以在代碼運(yùn)行的最后一刻決定調(diào)用哪個(gè)方法蛾默,這個(gè)技巧稱為動(dòng)態(tài)派發(fā)懦铺。

? ? ? ? 問題:send方法可以調(diào)用私有方法,這是破壞封裝的行為支鸡,可以使用public_send方法代替冬念。

②動(dòng)態(tài)定義方法

? ? ? ? 可以使用Module#define_method方法隨時(shí)定義一個(gè)方法。define_method方法在MyClass內(nèi)部執(zhí)行牧挣,這種在運(yùn)行時(shí)定義方法的技術(shù)成為動(dòng)態(tài)方法急前。用Module#define_method方法代替def關(guān)鍵字定義方法的一個(gè)重要原因就是:define_method方法允許在運(yùn)行時(shí)決定方法的名字。

????????define_method方法是類方法,只有類才能調(diào)用,也是私有方法瀑构。它不能有顯式調(diào)用裆针,也就是不能有接受者,不能self.define_method這樣調(diào)用,可以通過send(:define_method)強(qiáng)制調(diào)用据块。

method_missing方法

????????method_missing是BasicObject的一個(gè)實(shí)例方法,而所有的對(duì)象都繼承自BasicObject類, 當(dāng)調(diào)用一個(gè)方法時(shí),若在祖先鏈中未找到該方法,則會(huì)調(diào)用method_missing方法, BasicObject#method_missing()方法會(huì)拋出一個(gè)NoMethodError進(jìn)行響應(yīng)码邻。

????????覆寫method_missing方法可以讓你調(diào)用實(shí)際上并不存在的方法折剃。

幽靈方法

? ? ? ? 如果需要定義很多相似的方法時(shí)另假,可以通過method_missing()方法來方便開發(fā),使用method_missing()方法處理消息怕犁,從調(diào)用者角度看與普通方法并無差別边篮,但實(shí)際上接收者并沒有相應(yīng)的方法,只是統(tǒng)一進(jìn)行了處理奏甫,這被稱為幽靈方法戈轿。

? ? ? ? Hashie庫中有一個(gè)神奇的類Hash::Mash。如果想添加一個(gè)新的屬性阵子,只要給這個(gè)屬性賦值即可思杯。

? ??????Hash::Mash是Hash類的子類,并且它的屬性是幽靈方法挠进,源碼如下:

動(dòng)態(tài)代理

????????一個(gè)捕獲幽靈方法調(diào)用并把它們轉(zhuǎn)發(fā)給另一個(gè)對(duì)象的對(duì)象,稱為動(dòng)態(tài)代理色乾。

????????注意:使用method_missing技術(shù)后,所有不存在方法的調(diào)用都會(huì)調(diào)用你覆蓋的方法领突,這樣會(huì)導(dǎo)致一些錯(cuò)誤信息(你看不到NoSuchMethod這樣的提示了)暖璧,因此, 在使用method_missing方法的時(shí)候君旦,一定要限定其使用范圍澎办,并且調(diào)用父類的super.method_missing方法,還原錯(cuò)誤處理.

白板類

????????當(dāng)一個(gè)幽靈方法和真實(shí)方法發(fā)生沖突時(shí), 而會(huì)執(zhí)行真實(shí)的方法, 這個(gè)問題就是動(dòng)態(tài)代理的通病, 為了安全起見, 應(yīng)該在代理類中刪除絕大多數(shù)繼承來的方法, 這就是所謂的白板類.?

????????- Module#undef_method()方法會(huì)刪除所有的(包括繼承的)方法?

????????- Module#remove_method()方法只會(huì)刪除接收者自己的(保留繼承的)方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末金砍,一起剝皮案震驚了整個(gè)濱河市局蚀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恕稠,老刑警劉巖至会,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谱俭,居然都是意外死亡奉件,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門昆著,熙熙樓的掌柜王于貴愁眉苦臉地迎上來县貌,“玉大人,你說我怎么就攤上這事凑懂∶汉郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摆碉。 經(jīng)常有香客問我塘匣,道長(zhǎng),這世上最難降的妖魔是什么巷帝? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任忌卤,我火速辦了婚禮,結(jié)果婚禮上楞泼,老公的妹妹穿的比我還像新娘驰徊。我一直安慰自己,他們只是感情好堕阔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布棍厂。 她就那樣靜靜地躺著,像睡著了一般超陆。 火紅的嫁衣襯著肌膚如雪牺弹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天时呀,我揣著相機(jī)與錄音张漂,去河邊找鬼。 笑死退唠,一個(gè)胖子當(dāng)著我的面吹牛鹃锈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞧预,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼屎债,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了垢油?” 一聲冷哼從身側(cè)響起盆驹,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滩愁,沒想到半個(gè)月后躯喇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硝枉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年廉丽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妻味。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡正压,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出责球,到底是詐尸還是另有隱情焦履,我是刑警寧澤拓劝,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站嘉裤,受9級(jí)特大地震影響郑临,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屑宠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一厢洞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侨把,春花似錦犀变、人聲如沸妹孙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠢正。三九已至骇笔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚣崭,已是汗流浹背笨触。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雹舀,地道東北人芦劣。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像说榆,于是被迫代替她去往敵國和親虚吟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理签财,服務(wù)發(fā)現(xiàn)串慰,斷路器,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • Ruby是一門動(dòng)態(tài)語言唱蒸,動(dòng)態(tài)創(chuàng)建與調(diào)用方法是其中一個(gè)體現(xiàn)邦鲫。 動(dòng)態(tài)方法 動(dòng)態(tài)調(diào)用方法(動(dòng)態(tài)派發(fā)) 動(dòng)態(tài)調(diào)用方法,是指...
    未必治撕大叔閱讀 1,095評(píng)論 2 8
  • 對(duì)象模型 所有class定義之外的代碼默認(rèn)運(yùn)行在頂級(jí)對(duì)象main中神汹。 打開類 ruby的class更像是一個(gè)作用于...
    五月的約修亞閱讀 3,470評(píng)論 0 4
  • 每一分 每一秒都在準(zhǔn)備 唯獨(dú)沒準(zhǔn)備來生 每一時(shí) 每一刻都在感受 唯獨(dú)忘記感受敬畏 這世間的紛繁復(fù)雜 原來有假象 虛...
    行者走天涯閱讀 316評(píng)論 4 7
  • 這是一封寫給五年后自己的信庆捺。 五年以后,我24歲屁魏,不出錯(cuò)的話正好兩年研究生畢業(yè)滔以,拿到一份不算差的文憑,一個(gè)人去不是...
    卷說閱讀 172評(píng)論 2 1