Ruby中的类别名

Ada*_*NYC 43 ruby alias ruby-on-rails class

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

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

Jör*_*tag 87

类在Ruby中没有名称.它们只是分配给变量的对象,就像任何其他对象一样.如果要通过其他变量引用类,请将其分配给另一个变量:

Foo = String
Run Code Online (Sandbox Code Playgroud)

  • 这不是变数.它是常量(所有以大写字母开头的标识符都是常量). (3认同)
  • @boulder_ruby:你在说什么?`Foo = []; Bar = Foo; Foo << 1; p Bar#[1]` (2认同)

Siw*_*申思维 15

在文件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
Run Code Online (Sandbox Code Playgroud)

"任何以大写字母开头的引用,包括类和模块的名称,都是常量" - "metaprogramming ruby​​",page38,Constant section


Mar*_* G. 5

有人来这里寻找如何为一个rails模型类别名来获得一个新名称:

我能够简单地做Foo = Bar,但不得不把Foo它自己的模型文件放在里面,这样我就不会得到未初始化的常量错误.例如

# models/foo.rb
Foo = Bar
Run Code Online (Sandbox Code Playgroud)

你可能还会发现怪事尝试使用别名制像协会has_many,has_one等我发现你通常可以围绕这些获得通过根命名空间(或相应的命名空间取决于你的模型如何结构化),以确保Rails正在努力自动加载正常的常量:

has_many :foo, class_name: '::Foo'
Run Code Online (Sandbox Code Playgroud)