2012-03-21 14 views
18

でクラスのWordのスーパー不一致私はWordクラスを作成していると私はエラーを取得しています:TypeError例外:ルビー

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>' 
+1

はWord'は最初のものと競合して二 'クラスのように見えます。 IRBを閉じずにそれをクリアして再オープンする方法はわかりません。 – ScottJShea

+0

そしてFYIでは、クラス、ループ、さらに複雑なブロックをスクリプトで実行し、スクリプトを実行する傾向があります。 – ScottJShea

+0

これは、Rubyファイルで同じことをするという点でも、私たちの良い教訓です。念押し有難う。 –

答えて

32

親指:ここ

TypeError: superclass mismatch for class Word

IRBコードですirb(いずれかの方法でirbまたはrails console

継承(スーパークラス)を使用して同じクラスを2回作成する場合は、irbインスタンスを終了してもう一度作成します。なぜこれ?それ以外の場合は、クラスの競合が発生するためです。

あなたの場合はWindowsを使用しているので、DOSプロンプトにexitと入力してirbまたはrails consoleと入力してWordクラスを作成すると動作します。それがあなたのために働かない場合私に知らせてください。すでに定義を再開することによってすることができますmonkey-patchクラス(ほとんどの動的言語のように)RubyではObject

class Word 
... 
end 

から継承するようWordクラスを定義しているので、

15

それはあなたのスーパークラスの不一致エラーを与える理由は、クラスを変更します。しかし、あなたのインスタンスでは、クラスを再度開いているときに、クラスをスーパークラスStringから継承して再定義しようとしています。

class Word < String 
... 
end 

クラスとその継承構造が定義されたら、再びそれを定義することはできません。

いくつかの人が言っているように、irbを終了して再起動すると、Wordクラスを定義する際に最初からやり直すことができます。

+0

_クラスとその継承構造が定義されていれば、それを再び定義することはできません._これは私が必要としたものです – Anwar

13

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 
+0

面白い:)この作品をありがとう – RohanDaxini