如何在Ruby中取消定义类?

Bhu*_*dha 53 ruby activerecord ruby-on-rails-3

在Ruby中取消定义方法非常简单,我可以使用undef METHOD_NAME.

班级有类似的东西吗?我在MRI 1.9.2.

我必须取消定义ActiveRecord模型,运行两行代码,然后将模型恢复为原始形式.

问题是,我有一个模型Contact,我正在使用公司的API,并且碰巧他们有一些叫做的类Contact,而改变我的模型名称对我来说将是很多工作.

在这种情况下我该怎么办?

Lee*_*vis 87

>> class Foo; end
=> nil
>> Object.constants.include?(:Foo)
=> true
>> Object.send(:remove_const, :Foo)
=> Foo
>> Object.constants.include?(:Foo)
=> false
>> Foo
NameError: uninitialized constant Foo
Run Code Online (Sandbox Code Playgroud)

编辑只是注意到你的编辑,删除常量可能不是实现你正在寻找的最好的方法.为什么不将其中一个Contact类移动到单独的命名空间中.

EDIT2你也可以像这样暂时重命名你的班级:

class Foo
  def bar
    'here'
  end
end

TemporaryFoo = Foo
Object.send(:remove_const, :Foo)
# do some stuff
Foo = TemporaryFoo
Foo.new.bar #=> "here"
Run Code Online (Sandbox Code Playgroud)

同样,问题在于你仍然会有更新的Contact类,所以你必须再次删除它.我真的建议你的类名称间距.这也可以帮助您避免任何加载问题

  • 不,您可能需要从`$ LOADED_FEATURES`中删除`contact.rb`文件,然后重新加载它,但这可能有一些副作用.当我第一次写回答时,我没有注意到你的编辑,所以我已经更新了它.也就是说,您可以暂时重命名它. (2认同)