【发布时间】:2012-10-06 17:29:36
【问题描述】:
我正在使用 Ruby v1.9.2 和 Ruby on Rails v3.2.2 gem。我有以下模块
module MyModule
extend ActiveSupport::Concern
included do
def self.my_method(arg1, arg2)
...
end
end
end
我想为类方法命名为my_method。所以,我陈述了以下(不工作)代码:
module MyModule
extend ActiveSupport::Concern
included do
def self.my_method(arg1, arg2)
...
end
# Note: the following code doesn't work (it raises "NameError: undefined
# local variable or method `new_name' for #<Class:0x00000101412b00>").
def self.alias_class_method(new_name, old_name)
class << self
alias_method new_name, old_name
end
end
alias_class_method :my_new_method, :my_method
end
end
换句话说,我想以某种方式扩展Module 类,以便在MyModule 中添加一个alias_class_method 方法。但是,我想让它在我所有的 Ruby on Rails 应用程序中工作并且可用。
- 我应该把与
Module类的Ruby 核心扩展相关的文件放在哪里?也许在 Ruby on Railslib目录中? - 我应该如何在核心扩展文件中正确“扩展”
Module类? - 这是正确的方法吗?也就是说,例如,我应该“扩展”另一个类(
Object、BasicObject、Kernel、...)而不是Module?或者,我应该完全避免实施上述核心扩展吗?
但是,更重要的是,是否有一个 Ruby 功能可以让我完成我想要完成的工作,这样我就不必扩展它的类?
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming core extending