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_many
, has_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,但“只读”,可以这么说 。