Forum: Ruby dynamic changes!

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Spitfire (Guest)
on 2006-12-25 20:42
(Received via mailing list)
These are the sequence of actions I performed in irb.

	class Dumber
		def sayHello
			puts "Hello!"
		end
	end

	db = Dumber.new()

	db.sayHello
	## executes sayHello method!

	Class Dumber
		def sayHi
			puts "Hi"
		end
	end

	db.sayHi
	## executes the newly added method sayHi!

   how does the object already created aware of the newly added method?
Robert K. (Guest)
on 2006-12-25 21:42
(Received via mailing list)
On 25.12.2006 19:37, Spitfire wrote:
>     db.sayHello
>
>   how does the object already created aware of the newly added method?

The method is added to it's *class* - and that relationship does not
change, only the class changes.

$ irb
irb(main):001:0> class Dumber
irb(main):002:1> def say_hello() puts "hello" end
irb(main):003:1> end
=> nil
irb(main):004:0> Dumber.instance_methods.grep /^say_/
=> ["say_hello"]
irb(main):005:0> Dumber.object_id
=> 1913790
irb(main):006:0> class Dumber
irb(main):007:1> def say_hi() puts "hi" end
irb(main):008:1> end
=> nil
irb(main):009:0> Dumber.instance_methods.grep /^say_/
=> ["say_hi", "say_hello"]
irb(main):010:0> Dumber.object_id
=> 1913790

As you see, Dumber stays the same instance, there are no multiple
versions of it.

Kind regards

	robert
Spitfire (Guest)
on 2006-12-25 21:46
(Received via mailing list)
Robert K. wrote:
>>     db.sayHello
>>
>>   how does the object already created aware of the newly added method?
>
> The method is added to it's *class* - and that relationship does not
> change, only the class changes.

It's class? I'm sorry I don't understand what you are saying. Can you
please clarify?
Robert K. (Guest)
on 2006-12-25 21:56
(Received via mailing list)
On 25.12.2006 20:44, Spitfire wrote:
>>>
>>>     ## executes the newly added method sayHi!
>>>
>>>   how does the object already created aware of the newly added method?
>>
>> The method is added to it's *class* - and that relationship does not
>> change, only the class changes.
>
> It's class? I'm sorry I don't understand what you are saying. Can you
> please clarify?

Sorry, should have read "its class".  Please look closely at the IRB
session to understand what I mean:

irb(main):001:0> class Foo
irb(main):002:1> def m1() end
irb(main):003:1> end
=> nil
irb(main):004:0> Foo.object_id
=> 1917050
irb(main):005:0> Foo.instance_methods.grep /m\d/
=> ["m1"]
irb(main):006:0> f=Foo.new
=> #<Foo:0x381468>
irb(main):007:0> f.class
=> Foo
irb(main):008:0> f.class.object_id
=> 1917050
irb(main):009:0> f.m1
=> nil
irb(main):010:0> f.m2
NoMethodError: undefined method `m2' for #<Foo:0x381468>
         from (irb):10
         from :0
irb(main):011:0> class Foo
irb(main):012:1> def m2() end
irb(main):013:1> end
=> nil
irb(main):014:0> Foo.object_id
=> 1917050
irb(main):015:0> Foo.instance_methods.grep /m\d/
=> ["m2", "m1"]
irb(main):016:0> f.class
=> Foo
irb(main):017:0> f.class.object_id
=> 1917050
irb(main):018:0> f.m1
=> nil
irb(main):019:0> f.m2
=> nil

	robert
This topic is locked and can not be replied to.