Superclass mismatches

L

listrecv

I'm sometimes seeing an error "superclass mismatch". I have no idea
what this error is. could anyone either explain it or point me to the
docs (or src code)?
 
M

Mauricio Fernandez

I'm sometimes seeing an error "superclass mismatch". I have no idea
what this error is. could anyone either explain it or point me to the
docs (or src code)?

X = Class.new
Y = Class.new
class Foo < X; end
class Foo < Y; end
# ~> -:4: superclass mismatch for class Foo (TypeError)

In the above situation it's obvious that you're saying that Foo is derived
from X at first and then Y (!= X) the second time, but you might have run into
this problem with something like

class Foo < Struct.new:)a, :b, :c)
# ....
end

if you load()ed that file more than once (this can happen if you require()
the file under two different names), since each time Struct.new is evaluated
a new class will be created.
 
L

listrecv

Thanks for the explanation. I'm still stumped - it seems like I have
two classes with the same name:

irb(main):015:0> ResellerCategory
=> Taxonomy::ResellerCategory
irb(main):016:0> ResellerCategory.superclass
=> Taxonomy::Category
irb(main):017:0> ResellerCategory.superclass == Taxonomy::Category
=> false

Huh?

irb(main):018:0> ResellerCategory.superclass.object_id
=> 46413760
irb(main):019:0> Taxonomy::Category.object_id
=> 47673490

How did that happen?

irb(main):020:0> module Taxonomy; class ResellerCategory < Category;
end ; end
TypeError: superclass mismatch for class ResellerCategory
irb(main):023:0> module Taxonomy; class ResellerCategory <
ResellerCategory.superclass; end ; end
=> nil

My questions are:
1) How did that happen? It seems like 1 != 1
2) More importantly, how can I stop this error from happening? (It's
caused when the file defining ResellerCategory is loaded a second time)
 
M

Mauricio Fernandez

irb(main):015:0> ResellerCategory
=> Taxonomy::ResellerCategory
irb(main):016:0> ResellerCategory.superclass
=> Taxonomy::Category
irb(main):017:0> ResellerCategory.superclass == Taxonomy::Category
=> false [...]
irb(main):018:0> ResellerCategory.superclass.object_id
=> 46413760
irb(main):019:0> Taxonomy::Category.object_id
=> 47673490 [...]
irb(main):020:0> module Taxonomy; class ResellerCategory < Category;
end ; end
TypeError: superclass mismatch for class ResellerCategory
irb(main):023:0> module Taxonomy; class ResellerCategory <
ResellerCategory.superclass; end ; end
=> nil

My questions are:
1) How did that happen? It seems like 1 != 1

Taxonomy::Category has been redefined, as if you were doing
module Taxonomy; Category = Class.new { ... } end
or maybe
module Taxonomy; remove_const :Category; class Category; ... end end
and that were being evaluated more than once.
Can you show the code?
2) More importantly, how can I stop this error from happening? (It's
caused when the file defining ResellerCategory is loaded a second time)

You have to make sure that Taxonomy::Category references the same class all
the time. If you can't find why it's changing, you can get by with
module Taxonomy; class ResellerCategory < Category; end end
which must be eval()ed only once, and then replacing in the file to be loaded
repeatedly
class ResellerCategory < Category
with
class ResellerCategory

HTH
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top