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)?
On Mon, Aug 07, 2006 at 07:00:06AM +0900, [email protected] wrote:
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.
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:
- How did that happen? It seems like 1 != 1
- More importantly, how can I stop this error from happening? (It’s
caused when the file defining ResellerCategory is loaded a second time)
On Mon, Aug 07, 2006 at 05:10:11PM +0900, [email protected] wrote:
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
=> nilMy questions are:
- 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?
- 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