这更多的是一个理论问题,但我仍然很好奇。我是一个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中的原始类现在已将我的行为添加到它中)。但是,在运行期间初始化没有效果。什么都没有中断,但控制器没有延长。