[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Superclass mismatches

List Recv

8/6/2006 9:57:00 PM

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)?

3 Answers

Mauricio Fernández

8/6/2006 10:13:00 PM

0

On Mon, Aug 07, 2006 at 07:00:06AM +0900, listrecv@gmail.com 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.

--
Mauricio Fernandez - http://eige... - singular Ruby

List Recv

8/7/2006 8:06:00 AM

0

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)

Mauricio Fernández

8/7/2006 9:22:00 AM

0

On Mon, Aug 07, 2006 at 05:10:11PM +0900, listrecv@gmail.com 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
> => 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
--
Mauricio Fernandez - http://eige... - singular Ruby