TypeError:Ruby中类Word的超类不匹配

我正在创建一个Word类,我收到一个错误:

TypeError:类Word的超类不匹配

这是irb代码:

 irb(main):016:0> class Word irb(main):017:1> def palindrome?(string) irb(main):018:2> string == string.reverse irb(main):019:2> end irb(main):020:1> end => nil irb(main):021:0> w = Word.new => # irb(main):022:0> w.palindrome?("foobar") => false irb(main):023:0> w.palindrome?("level") => true irb(main):024:0> class Word  def palindrome? irb(main):026:2> self == self.reverse irb(main):027:2> end irb(main):028:1> end TypeError: superclass mismatch for class Word from (irb):24 from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:47:in `start' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:8:in `start' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands.rb:41:in `' from script/rails:6:in `require' from script/rails:6:in `' 

irb的拇指规则(无论是irb还是rails console

如果要使用inheritance(超类)创建相同的类两次,请退出irb实例并再次创建它。 为什么这个? 因为否则会发生类冲突。

在您的情况下,您正在使用Windows(从问题中找到),因此只需在DOS提示符下键入exit并再次输入irbrails console并创建您的Word类,它应该可以工作。 如果它不适合你,请告诉我。

它给你一个超类不匹配错误的原因是因为你已经将Word类定义为inheritance自Object

 class Word ... end 

在Ruby中(与大多数动态语言一样),您可以通过重新打开定义和修改类来修补类。 但是,在您的实例中,当您重新打开该类时,您还尝试将该类重新定义为inheritance自超类String

 class Word < String ... end 

一旦定义了类及其inheritance结构,就无法再次定义它。

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

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

但是,如果不放弃irb(并且丢失所有其他工作),则可以更轻松地修复。 您可以通过这种方式删除现有的类定义。

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

你可以用以下方式validation:

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

哪个应该返回:

 NameError: uninitialized constant Word from (irb):52 

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

 > module M > class Word > def palindrome?(string) > string == string.reverse > end > end > end => nil > w = Word.new => # > w.palindrome?("foobar") => false > w.palindrome?("level") => true > module M > class Word < String > def palindrome? > self == self.reverse > end > end > end