2012-03-21 11 views
18

tworzę klasę Word i otrzymuję błąd:TypeError: nadklasą niedopasowanie dla klasy Słowa w Ruby

TypeError: superclass mismatch for class Word

Oto kod 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

Wygląda sekund 'klasa Word' jest sprzeczne z pierwszym. Nie wiem, jak to wyczyścić bez zamykania IRB i ponownego otwarcia. – ScottJShea

+0

Jako FYI mam tendencję do wykonywania klas, pętli i bardziej złożonych bloków w skrypcie i uruchamiania skryptu niż korzystania z IRB. – ScottJShea

+0

Dobra lekcja dla nas także w tym, że zrobiłoby to samo w każdym pliku Ruby. Dzięki za przypomnienie. –

Odpowiedz

32

Kciuk zasada dla irb (w obu przypadkach irb lub rails console)

Jeśli tworzysz tę samą klasę dwukrotnie z dziedziczeniem (nadklasą), zakończ instancję irb i utwórz ją ponownie. Dlaczego to? Ponieważ w przeciwnym razie dojdzie do konfliktów klasowych.

W Twoim przypadku korzystania z systemu Windows (znajdujący się z pytaniem), więc wystarczy wpisać exit na DOS i ponownie wpisać irb lub rails console i utworzyć klasę słowo i powinno działać. Daj mi znać, jeśli to nie działa.

15

Powód to daje błąd nadklasą niedopasowania dlatego już zdefiniowano klasę Word jak dziedziczenie z Object

class Word 
... 
end 

W Ruby (podobnie jak w językach najbardziej dynamicznych) Można monkey-patch klas poprzez ponowne otwarcie definicji i modyfikując klasę. Jednak w twojej instancji, gdy ponownie otwierasz klasę, próbujesz również przedefiniować klasę jako dziedziczącą po super klasie String.

class Word < String 
... 
end 

Po zdefiniowaniu klasy i jej struktury dziedziczenia nie można jej zdefiniować ponownie.

Jak powiedziało kilka osób, zamknięcie i ponowne uruchomienie irb pozwala rozpocząć od zera definiowanie klasy Word.

+0

_Po zdefiniowaniu klasy i struktury dziedziczenia nie można jej zdefiniować ponownie. _ To mi było potrzebne – Anwar

13

Link664 jasno wyjaśnił problem.

Istnieje jednak łatwiejsza poprawka bez rzucania irb (i utraty wszystkich innych prac). Możesz usunąć istniejącą definicję klasy w ten sposób.

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

i można zweryfikować z:

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

które powinny powrócić:

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

Interesujące :) Dzięki za tę pracę – RohanDaxini

Powiązane problemy