重新初始化ruby类

时间:2013-07-06 23:41:59

标签: ruby metaprogramming

我怎么解决?

class Person
end

class Person < ActiveRecord::Base
end

TypeError: superclass mismatch for class Person.


我想重新初始化一个班级。

4 个答案:

答案 0 :(得分:6)

一旦你在ruby中创建了一个类,就不能通过重新打开它来改变它的超类。 这就是您收到TypeError: superclass mismatch for class Person.错误的原因。

其他答案提供了替代方案,但重要的是要注意,它们都没有修改现有的Person类,但实际上创建了一个新类,并将旧的Person常量重新分配给新类,在已有的限制下由@ user1158559在他的回答中说明。

答案 1 :(得分:2)

请确保每次都使用相同的班级签名。

class Person < ActiveRecord::Base
  def x
  end
end


class Person < ActiveRecord::Base
  def y
  end
end

答案 2 :(得分:2)

你可以(有点)这样做。

# initial definition
class Person
end

# new definition
class OverridePerson < ActiveRecord::Base
end

Person = OverridePerson
  • 请参阅@Andrew Marshall的评论。您可以取消定义Person,然后在不创建虚拟类OverridePerson
  • 的情况下定义它

与您想要做的事情相似:

  • Person将引用新课程

与您想要做的事情的区别:

  • 现有实例不会更改其类
  • 类方法和变量将被破坏
  • Person.name将为OverridePerson,但您可以将其覆盖为“Person”

您的使用案例可能是:

  • 重新定义Person,将其打包以欺骗库或应用程序。虽然ActiveRecord :: Base对于duck-type来说是一个很难的选择,但IMO对于测试来说是完全合法的。我建议在原始类

  • 上使用FakeAR或RSpec模拟或存根
  • 您想创建一个名为Person的类,但它已经定义。在这种情况下,我建议在模块中使用命名空间。

答案 3 :(得分:0)

它可能不是您寻找的答案,但它可以通过undefine a class或常量来重新定义它,但它将失去所有原始方法:

Object.send(:remove_const, :Person) 
相关问题