Hi -- On Sun, 19 Aug 2007, Matthew B Gardner wrote: > 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'm feeling a little stupid, but where do you define Character#== ? David -- * Books: RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242) RUBY FOR RAILS (http://www.manning.com/black) * Ruby/Rails training & consulting: Ruby Power and Light, LLC (http://www.rubypal.com)