来自cgi.rb的Ruby错误"类Cookie的超类不匹配"
时间:2020-03-06 14:40:35 来源:igfitidea点击:
我刚刚将我的gentoo服务器上的ruby安装更新为ruby 1.8.6 patchlevel 287,并开始在我的一个eRuby应用程序上遇到错误。 apache error_log文件中给出的错误是:
[error] mod_ruby: /usr/lib/ruby/1.8/cgi.rb:774: superclass mismatch for class Cookie (TypeError)
奇怪的是,有时它似乎可以正常工作,但有时我会收到该错误。有人有想法吗?
解决方案
当我们重新声明已经声明的类时,将显示该错误,这很可能是因为我们加载了cgi.rb的两个不同副本。在Rails中看到类似的问题。
如错误消息所述,在代码中某处打开了Cookie类,使用的超类与先前定义或者打开Cookie类中使用的超类不同。
即使没有明确指定超类的类定义也仍然具有超类:
class Cookie end
这将Cookie类与Object的超类一起定义。
我以前遇到过此错误,当我们有一些代码尝试在不指定超类的情况下重新打开一个类时,就会发生这种错误,并且程序员的假设是该类(在本例中为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
因此,我们可能只需要grep获取Cookie类的定义,并尝试确保始终以正确的顺序对文件进行require-d操作。这可能很容易,也可能不容易。 :)