Superclass mismatches

Discussion in 'Ruby' started by listrecv@gmail.com, Aug 6, 2006.

  1. Guest

    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)?
     
    , Aug 6, 2006
    #1
    1. Advertising

  2. On Mon, Aug 07, 2006 at 07:00:06AM +0900, 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://eigenclass.org - singular Ruby
     
    Mauricio Fernandez, Aug 6, 2006
    #2
    1. Advertising

  3. Guest

    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)
     
    , Aug 7, 2006
    #3
  4. On Mon, Aug 07, 2006 at 05:10:11PM +0900, 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://eigenclass.org - singular Ruby
     
    Mauricio Fernandez, Aug 7, 2006
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Dave Theese
    Replies:
    1
    Views:
    419
  2. Gary

    prototype mismatches

    Gary, Jan 7, 2004, in forum: C++
    Replies:
    4
    Views:
    344
  3. Evan Klitzke
    Replies:
    0
    Views:
    368
    Evan Klitzke
    Aug 2, 2007
  4. bart van deenen
    Replies:
    6
    Views:
    762
    bart van deenen
    Mar 3, 2009
  5. Janus Bor
    Replies:
    3
    Views:
    210
    Harry Kakueki
    Sep 26, 2010
Loading...

Share This Page