Ruby 板


LINE

我想應該大部份 ruby 玩得稍微深入一點的人,都會覺得需要 uninclude 吧? 像是之前在 ruby-talk 看到挺瘋狂的 namespace 概念,就需要這種功能。 而一般在 ruby 裡想幹種種事,會被建議這樣用: BackupUser = User User = BackupUser.dup User.include Something # ... # ... # 拋棄 Something 吧 User = BackupUser.dup 我個人是覺得這是個很爛的招式 XD 有人用 C 寫 extension 真的做到了 uninclude: http://github.com/yrashk/rbmodexcl/tree/master 一點討論在這: Any reason for having no module exclusion functionality in Ruby http://www.ruby-forum.com/topic/150696 觀察了一下他在 rubinius (rbx) 上的實作,發現其實很單純: http://github.com/yrashk/rbmodexcl/tree/master/rbxmodexcl.rb 不過程式有點醜,所以我改了一下... http://github.com/godfat/rbx-include_remove/tree/master/include_remove.rb 基本上真的很單純,大概架構就是 module 本身是一個一個串起來的, 由 Module#superclass_chain 可以看出來。被 include 進去的 module, 會變成 IncludedModule 存在 superclass_chain 中。 而這個 chain 則是由類似 linked list 串起來的,由 superclass 串起。 藉由 Module#superclass= 即可改寫這個 linked list, 藉此移除 included module. 這邊比較神秘的是,superclass 本身是忽略 IncludedModule 的, 我想這是為了相容 MRI 的關係。所以查詢包含 IncludedModule 要用 direct_superclass. 其實 rubinius 類似這樣的動作還滿多的, 關於相容方面,JRuby 做得比較徹底。但 rubinius 彈性大到不可思議... 總之就是把 superclass_chain 當 linked list, 找到目標後移除目標 module, 像是這樣: prev.superclass = next.superclass 而 extend_remove 就利用前面寫好的 include_remove 即可, 因為 extend 其實就是 metaclass 的 include... metaclass.include_remove(mod) 這樣寫就好了。 == 比較神勇的是,rubinius 幾乎什麼都可以改寫,我甚至可以改寫 if condition then_clause else else_clause end 產生出來的 bytecode... 剛剛試了一陣子,要改寫 bytecode 的行為大概就不行了 本來想改寫 :goto_if_false 和 :goto_if_true, 但這好像是 c++ 的部份... 裡面還用到 reinterpret_cast 和 bitwise and, 不是很確定是什麼意思... 我想應該還有其他方法可以改寫 if 的行為才對,可能要改寫輸出的 bytecode. 把 if 再 wrap 一層,在外層呼叫 .nil? 不過雖然 rubinius 擴充性真的強到不可思議,跑起來也真的是好慢... 改寫 lib 後重新 compile 都要等好幾秒,啟動也要好幾秒... -- By Gamers, For Gamers - from the past Interplay --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP