Matthew Thill
2005-Mar-24  21:56 UTC
load, require, webrick and dynamically reloading changes
I''m seeing some strange behaviour and I''m hoping someone can
educate me
on why things are happening the way they are.
I have the following controller:
load ''some_object.rb''
class SomethingController < ApplicationController
   def index
	so = SomeObject.new(5,10)
	render_text ''success''
   end
end
and the following class in the file lib/some_object.rb:
class SomeObject
   attr_reader :value1, :value2
end
I start webrick and go to the following url (replace ..... with where 
webrick is listening) http://........./something/ and get an error - 
"wrong number of arguments (2 for 0)". This is expected.
I modify lib/some_object.rb to this:
class SomeObject
   attr_reader :value1, :value2
   def initialize(v1,v2)
     @value1 = v1
     @value2 = v2
   end
end
I reload the page and get the expected result, the word "success" on
the
page.
Now the strange thing. If I go back to some_object.rb and delete the 
initialize method, so I''m back to the original version, and reload the 
page again, everything works!! It shouldn''t, I should get that
"wrong
number of arguments (2 for 0)" error, but I don''t. Just the word 
"success" staring back at me. So I stop and restart webrick, then
reload
the page once more. This time, I get the error.
Why does webrick reload the class with the first change, but not the 
second? It seems as if once a version of the class SomeObject with an 
initialize method expecting 2 parameters has been loaded, this is always 
available, even if the actual class file has changed. I thought the load 
method would reload the class each time.
Does anyone have any insight?
Nicholas Seckar
2005-Mar-25  15:56 UTC
Re: load, require, webrick and dynamically reloading changes
On Thursday 24 March 2005 16:56, Matthew Thill wrote:> class SomeObject > attr_reader :value1, :value2 > end > > class SomeObject > attr_reader :value1, :value2 > def initialize(v1,v2) > @value1 = v1 > @value2 = v2 > end > end > > I should get that "wrong number of arguments (2 for 0)" error, but I don''t.Actually, you shouldn''t. First, you declare a class. Then, on the next request, you added initialize to it, and you tried to redefine the accessors. Then, on the request after that, you redefined the accessors. You haven''t cleared the class -- it''s been the same object all along, and so it has been accumulating methods all along. You could add Object.send(:const_remove, :SomeObject) if const_defined?(:SomeObject) But you should be using Rail''s require_dependency instead of load. -- Nicholas Seckar aka. Ulysses