2012-03-21 11 views
18

sto creando una classe Word e sto ottenendo un errore:TypeError: mancata corrispondenza superclasse per la classe Word in Ruby

TypeError: superclass mismatch for class Word

Ecco il codice 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>' 
+1

Sembra seconda classe 'word' è in conflitto con il primo. Non sei sicuro di come cancellarlo senza chiudere IRB e riaprirlo. – ScottJShea

+0

E come FYI tendo a fare classi, cicli e blocchi più complessi in uno script ed eseguo lo script piuttosto che usare l'IRB. – ScottJShea

+0

Una buona lezione per noi anche in quanto ciò farebbe la stessa cosa in qualsiasi file di Ruby. Grazie del promemoria. –

risposta

32

Un pollice regola per irb (in entrambi i casi irb o rails console)

Se si crea la stessa classe due volte con l'ereditarietà (superclasse), uscire dall'istanza irb e crearlo nuovamente. Perchè questo? Perché altrimenti i conflitti di classe accadranno.

Nel tuo caso, si utilizza Windows (trovato dalla domanda), quindi basta digitare exit il prompt di DOS e di nuovo tipo irb o rails console e creare la classe di Word e dovrebbe funzionare. Per favore fatemi sapere se non funziona per voi.

15

La ragione ti dà un errore di superclasse mancata corrispondenza è perché è già stato definito la classe Word come eredita da Object

class Word 
... 
end 

In Ruby (come in lingue più dinamici) monkey-patch potete classi riaprendo la definizione e modificando la classe. Tuttavia, nella tua istanza, quando stai riaprendo la classe, stai anche tentando di ridefinire la classe ereditando dalla super classe String.

class Word < String 
... 
end 

Una volta definita la classe e la struttura di ereditarietà, non è possibile definirla di nuovo

Come qualcuno ha detto, l'uscita e il riavvio di irb consentiranno di iniziare da zero nella definizione della classe Word.

+0

_Dopo che una classe e la sua struttura di ereditarietà sono state definite, non è possibile definirla di nuovo. Questo era quello di cui avevo bisogno – Anwar

13

link664 ha chiaramente spiegato il problema.

Tuttavia, c'è una soluzione più semplice senza abbandonare irb (e perdere tutti gli altri lavori). È possibile eliminare una definizione di classe esistente in questo modo.

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

ed è possibile verificare con:

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

che dovrebbe restituire:

NameError: uninitialized constant Word 
from (irb):52 
+0

Interessante :) Grazie per questo lavoro in giro – RohanDaxini

Problemi correlati