4

我刚刚将我的 gentoo 服务器上的 ruby​​ 安装更新到 ruby​​ 1.8.6 补丁级别 287,并且我的一个 eRuby 应用程序开始出现错误。apache error_log 文件中给出的错误是:

[error] mod_ruby: /usr/lib/ruby/1.8/cgi.rb:774: superclass mismatch for class Cookie (TypeError)

奇怪的是,它有时似乎可以工作-但有时我会收到该错误。有人有什么想法吗?

4

2 回答 2

9

正如错误消息所说,在代码中的某处打开了 Cookie 类,它使用的超类与先前定义或打开 Cookie 类中使用的超类不同。

即使一个没有明确指定超类的类定义仍然有一个超类:

class Cookie
end

这用 Object 的超类定义了 Cookie 类。

我之前遇到过这个错误,当你有一些代码试图重新打开一个类而不指定超类时会发生这种错误,而程序员的假设是这个类(在本例中为 Cookie)已经定义了,并且他只是重新打开它以添加一些功能。但是,如果重新打开和定义的顺序相反,您将收到该错误,因为该类已经被定义为 Object 的子类,但正在尝试重新定义或使用不同的超类重新打开。在 irb 中试试这个:

% irb
irb(main):001:0> class C < String; end
=> nil
irb(main):002:0> class C; end
=> nil
irb(main):003:0> exit
% irb
irb(main):001:0> class C; end
=> nil
irb(main):002:0> class C < String; end
TypeError: superclass mismatch for class C
        from (irb):2

So, you probably just have to grep for definitions of the Cookie class and try to ensure files are always being require-d in the correct order. This may or may not be easy. :)

于 2008-10-17T04:08:24.237 回答
2

当您重新声明一个已经声明的类时,就会出现该错误,这很可能是因为您正在加载 cgi.rb 的两个不同副本。请参阅Rails 中的类似问题

于 2008-09-24T18:48:40.840 回答