Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > where's the best place to dynamically add singleton method?

Reply
Thread Tools

where's the best place to dynamically add singleton method?

 
 
Iain Barnett
Guest
Posts: n/a
 
      04-28-2011
Hi,

If I've got a simple bit of initialisation code

def initialize( blah )
@listener =3D Blah.new blah
end

and I'd like to add a singleton method to instance (because I don't want =
to monkey patch the Blah library) where's the best place to do that? I =
know I could do:

def initialize( blah )
@listener =3D Blah.new blah
def @listener.my_mental_method
self.give_it_up! "quickly"
end
end

but is this a good place to do it, or is there something more =
eloquent/perfomant? I'd like all instances, wherever they are created, =
to have this method, so is there a better way altogether?

Just wondering.

Regards,
Iain=

 
Reply With Quote
 
 
 
 
Robert Klemme
Guest
Posts: n/a
 
      04-28-2011
On Thu, Apr 28, 2011 at 3:58 PM, Iain Barnett <(E-Mail Removed)> wrote:
> Hi,
>
> If I've got a simple bit of initialisation code
>
> =A0 =A0def initialize( blah )
> =A0 =A0 =A0@listener =3D Blah.new blah
> =A0 =A0end
>
> and I'd like to add a singleton method to instance (because I don't want =

to monkey patch the Blah library) where's the best place to do that? I know=
I could do:
>
> =A0 =A0def initialize( blah )
> =A0 =A0 =A0@listener =3D Blah.new blah
> =A0 =A0 =A0def @listener.my_mental_method
> =A0 =A0 =A0 =A0self.give_it_up! "quickly"


No self needed here.

> =A0 =A0 =A0end
> =A0 =A0end
>
> but is this a good place to do it, or is there something more eloquent/pe=

rfomant? I'd like all instances, wherever they are created, to have this me=
thod, so is there a better way altogether?

First of all, I'd place the method in a module so you have less
definitions around. Then I'd extend all instances with that module.
That also makes for easy addition of more methods.

module BlahExt
def your_mental_method
give_it_up! 'rather sooner than later'
end
end

The automatic part could be handled by changing Bar's #new:

class <<Blah
alias _new new

def new(*a,&b)
_new(*a,&b).extend BlahExt
end
end

Note that this does not deal with inheritance nicely. For that you
could do something similar with Bar's #initialize instead of #new.

If you do not need a global automatic I'd simply stick with

def initialize( blah )
@listener =3D Blah.new(blah).extend BlahExt
end

Kind regards

robert

--=20
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

 
Reply With Quote
 
 
 
 
Kresimir Bojcic
Guest
Posts: n/a
 
      04-28-2011
[Note: parts of this message were removed to make it a legal post.]

I think you can achieve functionality that you desire by using mixins,
modules and include statement... like this


module CoolMethods
def my_mental_method
....
end
end

class UnfortunateUserOfCoolMethod

include CoolMethods
....

end

Also if you need method on a class you can use extend intstead of
include....


Best Regards,

Kresimir Bojcic

www.kresimirbojcic.com


On Thu, Apr 28, 2011 at 3:58 PM, Iain Barnett <(E-Mail Removed)> wrote:

> Hi,
>
> If I've got a simple bit of initialisation code
>
> def initialize( blah )
> @listener = Blah.new blah
> end
>
> and I'd like to add a singleton method to instance (because I don't want to
> monkey patch the Blah library) where's the best place to do that? I know I
> could do:
>
> def initialize( blah )
> @listener = Blah.new blah
> def @listener.my_mental_method
> self.give_it_up! "quickly"
> end
> end
>
> but is this a good place to do it, or is there something more
> eloquent/perfomant? I'd like all instances, wherever they are created, to
> have this method, so is there a better way altogether?
>
> Just wondering.
>
> Regards,
> Iain
>


 
Reply With Quote
 
Iain Barnett
Guest
Posts: n/a
 
      05-06-2011

On 28 Apr 2011, at 15:09, Robert Klemme wrote:

> On Thu, Apr 28, 2011 at 3:58 PM, Iain Barnett <(E-Mail Removed)> =

wrote:
>> Hi,
>>=20
>> If I've got a simple bit of initialisation code
>>=20
>> def initialize( blah )
>> @listener =3D Blah.new blah
>> end
>>=20
>> and I'd like to add a singleton method to instance (because I don't =

want to monkey patch the Blah library) where's the best place to do =
that? I know I could do:
>>=20
>> def initialize( blah )
>> @listener =3D Blah.new blah
>> def @listener.my_mental_method
>> self.give_it_up! "quickly"

>=20
> No self needed here.
>=20
>> end
>> end
>>=20
>> but is this a good place to do it, or is there something more =

eloquent/perfomant? I'd like all instances, wherever they are created, =
to have this method, so is there a better way altogether?
>=20
> First of all, I'd place the method in a module so you have less
> definitions around. Then I'd extend all instances with that module.
> That also makes for easy addition of more methods.
>=20
> module BlahExt
> def your_mental_method
> give_it_up! 'rather sooner than later'
> end
> end
>=20
> The automatic part could be handled by changing Bar's #new:
>=20
> class <<Blah
> alias _new new
>=20
> def new(*a,&b)
> _new(*a,&b).extend BlahExt
> end
> end
>=20
> Note that this does not deal with inheritance nicely. For that you
> could do something similar with Bar's #initialize instead of #new.
>=20
> If you do not need a global automatic I'd simply stick with
>=20
> def initialize( blah )
> @listener =3D Blah.new(blah).extend BlahExt
> end
>=20
> Kind regards
>=20
> robert
>=20
> --=20
> remember.guy do |as, often| as.you_can - without end
> http://blog.rubybestpractices.com/
>=20



On 28 Apr 2011, at 15:15, Kresimir Bojcic wrote:

> I think you can achieve functionality that you desire by using mixins,
> modules and include statement... like this
>=20
>=20
> module CoolMethods
> def my_mental_method
> ....
> end
> end
>=20
> class UnfortunateUserOfCoolMethod
>=20
> include CoolMethods
> ....
>=20
> end
>=20
> Also if you need method on a class you can use extend intstead of
> include....
>=20
>=20
> Best Regards,
>=20
> Kresimir Bojcic
>=20
> www.kresimirbojcic.com



Thanks to you both for the input. Sorry I didn't reply sooner but was =
snowed under with other things and wanted to think about it and do a bit =
of research. I've been reading a lot more on what's going on with =
details of the Ruby inheritance model, all that stuff in the background =
that I was getting along with fine without till now (which I think is a =
testament to the language), and your answers helped.=20

Due to this I refactored things quite significantly so I've ended up not =
using this directly, but I've gone further for it.

Much appreciated

Regards,
Iain


 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      05-07-2011
On 06.05.2011 22:15, Iain Barnett wrote:

> Thanks to you both for the input. Sorry I didn't reply sooner but was
> snowed under with other things and wanted to think about it and do a
> bit of research. I've been reading a lot more on what's going on with
> details of the Ruby inheritance model, all that stuff in the
> background that I was getting along with fine without till now (which
> I think is a testament to the language), and your answers helped.
>
> Due to this I refactored things quite significantly so I've ended up
> not using this directly, but I've gone further for it.
>
> Much appreciated


I'm glad to hear that we could help you. Thank you for letting us know!

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Singleton methods without the singleton class Charles Oliver Nutter Ruby 4 03-22-2010 10:46 PM
Singleton object vs. enhancing singleton class Paul McMahon Ruby 3 06-09-2008 06:05 AM
Singleton Modules rather than Singleton Classes Trans Ruby 12 09-14-2007 06:45 AM
Singleton - Whether Cloneable overrides Singleton Proton Projects - Moin Java 4 03-27-2007 02:59 AM
Singleton classes and Singleton pattern Wilhelm Ruby 1 10-11-2006 01:08 PM



Advertisments