27

我正在创建单词类,我得到一个错误:

TypeError:类Word的超类不匹配

这是内部评级代码:

irb(main):016:0>类Wordirb(main):017:1>定义回文?(字符串)irb(主):018:2>string==string.reveseirb(主):019:2>结束irb(主):020:1>结束=>无irb(main):021:0>w=Word.new=>#<单词:0x4a8d970>irb(main):022:0>w.回文?(“foobar”)=>假irb(main):023:0>w.回文?(“水平”)=>真irb(main):024:0>类Word<字符串irb(main):025:1>定义回文?irb(主):026:2>self==self.reverseirb(主):027:2>结束irb(主):028:1>结束TypeError:类Word的超类不匹配来自(irb):24来自C:/Ruby193/lib/ruby/gems/1.9.1/gems/railies-3.2.1/lib/rails/commands/console.rb:47:in `start'来自C:/Ruby193/lib/rube/gems/1.9.1/gems/railties-3.21/lib/rails/commands/console.rb:8:在“开始”中来自C:/Ruby193/lib/ruby/gems/1.9.1/gems/railies-3.2.1/lib/rails/commands.rb:41:in`<top(required)>'来自script/rails:6:在“require”中来自script/rails:6:在“<main>”中
  • 看起来是第二个类单词与第一个冲突。但不知道如何在不关闭IRB和重新开放的情况下清除该漏洞。 评论 2012年3月21日23:25
  • 1
    作为FYI,我倾向于在脚本中创建类、循环和更复杂的块,并运行脚本,而不是使用IRB。 评论 2012年3月21日23:30
  • 对我们来说,这也是一个很好的教训,因为这在任何Ruby文件中都会做同样的事情。谢谢你的提醒。 评论 2015年1月30日21:37

4个答案4

重置为默认值
43

经验法则红外线(无论哪种方式内部评级轨道控制台)

如果使用继承(超类)创建同一个类两次,请退出irb实例并再次创建它。为什么这样?因为否则会发生阶级冲突。

在您的案例中,您使用的是Windows(从问题中找到),所以只需键入出口在DOS提示符下再次键入内部评级轨道控制台并创建Word类,它应该可以工作。如果它不适合您,请告诉我。

2
  • 2
    这真的是问题的解决方案吗。是的,如果退出并重新进入控制台,您可能不会遇到错误,但错误不表明代码有问题吗?
    – 裂缝
    评论 2020年4月14日22:19
  • 如果使用继承创建同一个类两次! 是 啊!我的案子是关于流浪者的。 评论 2021年12月1日22:06
22

它导致超类不匹配错误的原因是您已经定义了单词类作为继承自对象

类单词...结束

在Ruby(像大多数动态语言一样)中,您可以monkey-patch游戏重新打开定义并修改类。然而,在您的实例中,当您重新打开类时,您也在尝试将该类重新定义为继承自超类字符串.

类Word<字符串...结束

一旦定义了类及其继承结构,就不能再次定义它。

正如一些人所说,退出并重新启动irb将允许您从头开始定义单词类。

1
  • 1
    一旦定义了类及其继承结构,就不能再次定义它。这就是我需要的
    – 安瓦尔
    评论 2017年5月23日10:11
17

link664已经清楚地解释了这个问题。

然而,有一个更容易的解决方案,不会放弃irb(并失去所有其他工作)。您可以通过这种方式删除现有的类定义。

irb(main):051:0>Object.send(:remove_const,:Word)

您可以通过以下方式进行验证:

irb(主):052:0>Word.public_instance_methods

它应该返回:

名称错误:未初始化常量Word来自(irb):52
0
0

绕过此问题的一个简单方法是在不同模块之间封装这两个类:

>模块M>类单词>定义回文?(字符串)>string==字符串反向>结束>完>结束=>无>w=M::新单词=>#<单词:0x4a8d970>>回文?(“foobar”)=>假>回文?(“水平”)=>真>模块N>类Word<字符串>定义回文?>self==自反转>结束>结束>结束>N:单词。new(“皮划艇”)。回文?=>真
2
  • 我把这个代码插入内部评级并得到相同的错误:TypeError:类Word的超类不匹配 评论 2019年7月23日22:17
  • 我不太记得我的答案了,我想我的意思是使用两个不同的模块名称(M(M)然后N个). 这是我常用的一个技巧,我会相应地更新我的答案。 评论 2019年7月29日12:29

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.