2012-03-21 14 views
18

Estoy creando una clase Word y estoy consiguiendo un error:TypeError: desajuste superclase para Word clase en Ruby

TypeError: superclass mismatch for class Word

Este es el código 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

Parece segunda clase 'Word' está en conflicto con la primera. Sin embargo, no estoy seguro de cómo borrar eso sin cerrar el IRB y volver a abrir. – ScottJShea

+0

Y como un FYI tiendo a hacer clases, bucles y bloques más complejos en un script y ejecutar el script que utilizar el IRB. – ScottJShea

+0

Una buena lección para nosotros también es que esto haría lo mismo en cualquier archivo de Ruby. Gracias por el recordatorio. –

Respuesta

32

Un pulgar regla para irb (de cualquier manera irb o rails console)

Si está creando la misma clase dos veces con inheritance (superclase), salga de la instancia de irb y vuelva a crearla. ¿Por qué esto? Porque de lo contrario ocurrirán conflictos de clase.

En su caso, se utiliza Windows (que se encuentra a partir de la pregunta), por lo que sólo tiene que escribir exit el indicador de DOS y escriba de nuevo irb o rails console y crear su clase Palabra y debería funcionar. Por favor, avíseme si no funciona para usted.

15

La razón por la que le da un error de superclase desajuste se debe a que ya ha definido la clase Word como herencia de Object

class Word 
... 
end 

En Rubí (como en los idiomas más dinámicas) Puede monkey-patch clases por la reapertura de la definición y modificando la clase. Sin embargo, en su instancia, cuando está reabriendo la clase, también está intentando redefinir la clase heredando de la superclase String.

class Word < String 
... 
end 

Una vez que se ha definido una clase y su estructura de herencia, no puede definirla de nuevo.

Como algunas personas han dicho, salir y reiniciar el IRB le permitirá comenzar de cero al definir la clase Word.

+0

_Una vez que se ha definido una clase y su estructura de herencia, no puede definirla de nuevo. Esto es lo que necesitaba – Anwar

13

link664 ha explicado claramente el problema.

Sin embargo, hay una solución más fácil sin dejar IRB (y perder todo su otro trabajo). Puede eliminar una definición de clase existente de esta manera.

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

y se puede verificar mediante:

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

que debe devolver:

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

Interesante :) Gracias por este trabajo – RohanDaxini

Cuestiones relacionadas