Hello -

>On Saturday 18 August 2007 17:56, David A. Black wrote:
> Hi --
>
> On Sun, 19 Aug 2007, Matthew B Gardner wrote:
> > Thank you to everyone who has tried to help me with this today -- I know
> > for certain -what- the problem is now, after adding in some testing. My
> > Character class, for whatever reason, is using == to evaluate class. So,
> > when I am trying to use Array#delete (array.delete(self) for a Character
> > object), it's deleting every Character object in that array instead of
> > just that single instance. I've tried to fix this issue by defining the
> > == method in my Character class like this:
> >
> > def Character
> > 	def == obj
> > 		self.equal?(obj)
> > 	end
> > end
> >
> > However, this doesn't initially work -- I have to reload the file during
> > runtime for it to utilize the above method. For sake of clarity, this is
> > what I mean:
> >
> > Start program...
> > a = Character.new
> > b = Character.new
> > a == b #=> true
> > Reload character.rb file while program is running...
> > a == b #=> false
> >
> > Hopefully that gets my meaning across. I'm not sure why Character#==
> > isn't initially getting used, or if there's something wrong with my
> > declaration. I'm also not sure why Character#== (prior to my defining
> > Character#==) is comparing class and my other classes aren't.
> >
> > I hope that this description is satisfactory -- and thank you for any
> > help that can be offered.
>
> I still can't tell what's happening without seeing actual code that's
> doing what you're describing. Have you got a running example?
>
>
> David

Here's the pertinent code:

require 'singleton'

class Engine
  include Singleton
  attr_reader :world
  def initialize
    @world = nil
  end

  def startup
    @world = World.new
  end
end

class World
  attr_accessor :characters
  def initialize
    @characters = []
  end
end

class Root
  def initialize name
    @name = name
  end
end

class Account
  attr_accessor :character
  def initialize
    @character = nil
  end
  def foo
    @character = Character.new "testname", self
    world.characters << @character
  end
end

class Mind < Root
  def initialize name
    super(name)
  end
end

class Character < Mind
  def initialize name, acc
    super(name)
    @account = acc
  end
  def quit
    world.characters.delete self
  end
end

def world
  Engine.instance.world
end

Engine.instance.startup
acc1 = Account.new
acc1.foo
acc2 = Account.new
acc2.foo
p world.characters.size
acc1.character.quit
p world.characters.size


However, this isn't reproducing my error (as you can see from the printout). 
As I've said before, I have other World#array variables that function the 
exact same way and don't run into the error I've been experiencing. Hopefully 
the code helps pinpoint (or at least hint at) why Character#== is evaluating 
class instead of identity, or why I have to reload the file for my defined 
Character#== to take effect.

I appreciate any help...I'm going a little crazy trying to solve this problem.
-Matt