這更多的是一個理論問題,但我仍然很好奇。我是一個ruby/ruby的新手(但在其他語言/框架中有很多古老的經驗),所以這主要是一個奇怪的/學習的問題。預先感謝任何幫助!使用Ruby別名來擴展Gem
我以爲我可以使用別名如下做一個快速的擴展,紅寶石寶石:
module InstallMyExtension
def self.included(base)
base.class_eval {
alias :some_method_in_gem_without_my_extension :some_method_in_gem
alias :some_method_in_gem :some_method_in_gem_with_my_extension
}
end
def some_method_in_gem_with_my_extension
debugger
# ... do fun stuff here
some_method_in_gem_without_my_extension
end
end
然後在一些初始化文件我做的:
Foo::SomeControllerInFoo.send :include, InstallMyExtension
我在輻射知道了這種技術CMS在那裏用它來擴展基本行爲。我知道這種技術現在已被拒絕,但它似乎是一種快速的方式,只是嘗試一些想法,然後在寶石上分支等等。
首先在Rails 3中有更好的方法來做一個快速的黑客擴展這樣(這可能是有用的只是爲了測試理論,建立該寶石等???之前)
第二關,它不工作了,有許多東西我不明白
然後讓我解釋一下我看到的奇怪:
即使如果我做了「包括」如上圖所示,當我進入我看到一些真正怪異的行爲控制檯,我不明白:
1)I型富:: SomeControllerInFoo正如我所料,我回到了Foo :: SomeControllerInFoo。但是如果第二次運行相同的精確表達式,Foo :: SomeControllerInFoo會返回undefined!
2)只是爲了玩弄我做了foo = Foo :: SomeControllerInFoo,然後我可以做foo.send,foo.methods,無論我喜歡什麼,但只有當我將這個類的副本保存在foo中!那是什麼? 3)如果我現在做了foo.send:include,MyExtension,調試控制檯內的行爲就像預期的那樣(即,包含在gem中的原始類現在已將我的行爲添加到它中)。但是,在運行期間初始化沒有效果。什麼都沒有中斷,但控制器沒有延長。