2

我该如何解决?

class Person
end

class Person < ActiveRecord::Base
end

TypeError: superclass mismatch for class Person.


我想重新初始化一个类。

4

4 回答 4

6

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

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

于 2013-07-06T23:51:47.190 回答
2

只要确保每次都使用相同的类签名。

class Person < ActiveRecord::Base
  def x
  end
end


class Person < ActiveRecord::Base
  def y
  end
end
于 2013-07-07T00:01:26.300 回答
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,鸭式键入它以欺骗库或应用程序。IMO 这对于测试目的来说是完全合法的,尽管 ActiveRecord::Base 将是一个很难鸭式的。我建议在原始类上使用 FakeAR 或 RSpec 模拟或存根

  • 您想创建一个名为 的类Person,但它已被定义。在这种情况下,我建议在模块中使用命名空间。

于 2013-07-07T00:09:23.647 回答
1

它可能不是您要寻找的答案,但它是一种方法undefine a class或常量,因此您可以重新定义它,但它会丢失所有原始方法:

Object.send(:remove_const, :Person) 
于 2013-07-07T18:29:05.150 回答