我正在创建一个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
=> #<Word:0x4a8d970>
irb(main):022:0> w.palindrome?("foobar")
=> false
irb(main):023:0> w.palindrome?("level")
=> true
irb(main):024:0> class Word < String
irb(main):025:1> 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 `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
答案 0 :(得分:36)
irb 的缩略图规则(irb
或rails console
)
如果使用继承(超类)创建同一个类两次,请退出irb实例并再次创建它。为什么这个?因为否则会发生类冲突。
在您的情况下,您正在使用Windows(从问题中找到),因此只需在DOS提示符下键入exit
,然后再次键入irb
或rails console
并创建您的Word类应该管用。如果它不适合你,请告诉我。
答案 1 :(得分:17)
它为您提供超类不匹配错误的原因是因为您已将Word
类定义为继承自Object
class Word
...
end
在Ruby中(与大多数动态语言一样),您可以通过重新打开定义和修改类来monkey-patch类。但是,在您的实例中,当您重新打开该类时,您还尝试将该类重新定义为继承自超类String
。
class Word < String
...
end
一旦定义了类及其继承结构,就无法再次定义它。
正如一些人所说,退出并重新启动irb将允许您从头开始定义Word
类。
答案 2 :(得分:14)
link664已经清楚地解释了这个问题。
但是,如果不放弃irb(并且丢失所有其他工作),则可以更轻松地修复。 您可以通过这种方式删除现有的类定义。
irb(main):051:0> Object.send(:remove_const, :Word)
您可以通过以下方式进行验证:
irb(main):052:0> Word.public_instance_methods
应返回:
NameError: uninitialized constant Word
from (irb):52
答案 3 :(得分:0)
绕过此问题的一种简单方法是将两个类封装在一个模块之间:
> module M
> class Word
> def palindrome?(string)
> string == string.reverse
> end
> end
> end
=> nil
> w = Word.new
=> #<Word:0x4a8d970>
> w.palindrome?("foobar")
=> false
> w.palindrome?("level")
=> true
> module M
> class Word < String
> def palindrome?
> self == self.reverse
> end
> end
> end