Ruby中的类别别名

我正在开发一个基于类似现有的新的Rails应用程序。 在我的旧应用程序中,我有Coupon类,这与我的新应用程序中的Ticket非常相似。 我想重复使用Coupon中的所有代码,但是要使用新的类名称。

由于重构在Rails中很麻烦,我想知道是否有办法在Ruby中为类创build别名(类似于属性和方法的别名)。

Ruby中没有名称。 它们只是分配给variables的对象,就像任何其他对象一样。 如果你想通过一个不同的variables来引用一个类,把它赋给一个不同的variables:

Foo = String 

在文件coupon.rb中:

 class Coupon #... end # add this line of code to make alias for class names # option1. if you haven't defined a "Ticket" class: Ticket = Coupon # option2. if Ticket has been defined, you have to redefine it: Object.send :remove_const, "Ticket" const_set "Ticket", Coupon 

“以大写字母开头的任何引用,包括类和模块的名称,都是一个常量” – “元编程ruby >>,第38页,常量部分

任何人都来这里寻找如何别名轨道模型类有一个新的名字:

我可以简单地做Foo = Bar ,但是必须把Foo放到它自己的模型文件中,这样我才不会得到未初始化的常量错误。 例如

 # models/foo.rb Foo = Bar 

你也许会发现在has_manyhas_one等关联中使用别名的奇怪现象。我发现你通常可以通过使用根名称空间(或者根据你的模型的结构而定的适当的名字空间)来解决这些问题,以确保Rails是试图自动加载正确的常量:

 has_many :foo, class_name: '::Foo' 

我同意warhog,或多或less – 但我会从你的优惠券类中分类票 – 这样,如果你需要做任何数据传输,你可以把代码放在你的票类

你必须小心这个,因为如果你的类经历了任何状态改变(增加了函数,改变常量,类variables等),你的类在别名被实例化所处的状态将不会反映你的更新类。

为了避免腕骨隧道而不牺牲可读性 ,你可以在你的别名对象而不是实际的类中存储一个lambda。 当然,lambda包含类,但这可以确保你的别名将调用你的类的最新版本。

我把这个放在我的supermanpatches.rb rails初始化器(在config/initializers/里面)‡

 LAP = lambda { LosAngelesParcel } 

现在你可以使用LAP[]调用这个类,并且你的类的一个新版本将被加载。 (允许你创build实例,例如, l = LAP[].new

轨道加载时运行一次,然后通过您的应用程序普及,可调用的任何地方像一个全局variables,但“只读”,可以这么说