[#6954] Why isn't Perl highly orthogonal? — Terrence Brannon <brannon@...>

27 messages 2000/12/09

[#7022] Re: Ruby in the US — Kevin Smith <kevinbsmith@...>

> Is it possible for the US to develop corporate

36 messages 2000/12/11
[#7633] Re: Ruby in the US — Dave Thomas <Dave@...> 2000/12/19

tonys@myspleenklug.on.ca (tony summerfelt) writes:

[#7636] Re: Ruby in the US — "Joseph McDonald" <joe@...> 2000/12/19

[#7704] Re: Ruby in the US — Jilani Khaldi <jilanik@...> 2000/12/19

> > first candidates would be mysql and postgressql because source is

[#7705] Code sample for improvement — Stephen White <steve@...> 2000/12/19

During an idle chat with someone on IRC, they presented some fairly

[#7750] Re: Code sample for improvement — "Guy N. Hurst" <gnhurst@...> 2000/12/20

Stephen White wrote:

[#7751] Re: Code sample for improvement — David Alan Black <dblack@...> 2000/12/20

Hello --

[#7755] Re: Code sample for improvement — "Guy N. Hurst" <gnhurst@...> 2000/12/20

David Alan Black wrote:

[#7758] Re: Code sample for improvement — Stephen White <steve@...> 2000/12/20

On Wed, 20 Dec 2000, Guy N. Hurst wrote:

[#7759] Next amusing problem: talking integers (was Re: Code sample for improvement) — David Alan Black <dblack@...> 2000/12/20

On Wed, 20 Dec 2000, Stephen White wrote:

[#7212] New User Survey: we need your opinions — Dave Thomas <Dave@...>

16 messages 2000/12/14

[#7330] A Java Developer's Wish List for Ruby — "Richard A.Schulman" <RichardASchulman@...>

I see Ruby as having a very bright future as a language to

22 messages 2000/12/15

[#7354] Ruby performance question — Eric Crampton <EricCrampton@...>

I'm parsing simple text lines which look like this:

21 messages 2000/12/15
[#7361] Re: Ruby performance question — Dave Thomas <Dave@...> 2000/12/15

Eric Crampton <EricCrampton@worldnet.att.net> writes:

[#7367] Re: Ruby performance question — David Alan Black <dblack@...> 2000/12/16

On Sat, 16 Dec 2000, Dave Thomas wrote:

[#7371] Re: Ruby performance question — "Joseph McDonald" <joe@...> 2000/12/16

[#7366] GUIs for Rubies — "Conrad Schneiker" <schneik@...>

Thought I'd switch the subject line to the subject at hand.

22 messages 2000/12/16

[#7416] Re: Ruby IDE (again) — Kevin Smith <kevins14@...>

>> >> I would contribute to this project, if it

17 messages 2000/12/16
[#7422] Re: Ruby IDE (again) — Holden Glova <dsafari@...> 2000/12/16

-----BEGIN PGP SIGNED MESSAGE-----

[#7582] New to Ruby — takaoueda@...

I have just started learning Ruby with the book of Thomas and Hunt. The

24 messages 2000/12/18

[#7604] Any corrections for Programming Ruby — Dave Thomas <Dave@...>

12 messages 2000/12/18

[#7737] strange border-case Numeric errors — "Brian F. Feldman" <green@...>

I haven't had a good enough chance to familiarize myself with the code in

19 messages 2000/12/20

[#7801] Is Ruby part of any standard GNU Linux distributions? — "Pete McBreen, McBreen.Consulting" <mcbreenp@...>

Anybody know what it would take to get Ruby into the standard GNU Linux

15 messages 2000/12/20

[#7938] Re: defined? problem? — Kevin Smith <sent@...>

matz@zetabits.com (Yukihiro Matsumoto) wrote:

26 messages 2000/12/22
[#7943] Re: defined? problem? — Dave Thomas <Dave@...> 2000/12/22

Kevin Smith <sent@qualitycode.com> writes:

[#7950] Re: defined? problem? — Stephen White <steve@...> 2000/12/22

On Fri, 22 Dec 2000, Dave Thomas wrote:

[#7951] Re: defined? problem? — David Alan Black <dblack@...> 2000/12/22

On Fri, 22 Dec 2000, Stephen White wrote:

[#7954] Re: defined? problem? — Dave Thomas <Dave@...> 2000/12/22

David Alan Black <dblack@candle.superlink.net> writes:

[#7975] Re: defined? problem? — David Alan Black <dblack@...> 2000/12/22

Hello --

[#7971] Hash access method — Ted Meng <ted_meng@...>

Hi,

20 messages 2000/12/22

[#8030] Re: Basic hash question — ts <decoux@...>

>>>>> "B" == Ben Tilly <ben_tilly@hotmail.com> writes:

15 messages 2000/12/24
[#8033] Re: Basic hash question — "David A. Black" <dblack@...> 2000/12/24

On Sun, 24 Dec 2000, ts wrote:

[#8178] Inexplicable core dump — "Nathaniel Talbott" <ntalbott@...>

I have some code that looks like this:

12 messages 2000/12/28

[#8196] My first impression of Ruby. Lack of overloading? (long) — jmichel@... (Jean Michel)

Hello,

23 messages 2000/12/28

[#8198] Re: Ruby cron scheduler for NT available — "Conrad Schneiker" <schneik@...>

John Small wrote:

14 messages 2000/12/28

[#8287] Re: speedup of anagram finder — "SHULTZ,BARRY (HP-Israel,ex1)" <barry_shultz@...>

> -----Original Message-----

12 messages 2000/12/29

[ruby-talk:7563] adding methods on the fly (was Re: Smalltalk and Python)

From: "Alex Martelli" <aleaxit@...>
Date: 2000-12-18 10:40:02 UTC
List: ruby-talk #7563
[Note: we've already been kindly asked to stop posting
this thread to fj.comp.lang.ruby, using comp.lang.ruby
instead, so I edited the newsgroups line accordingly]

"Greg Ewing" <greg@cosc.canterbury.ac.nz> wrote in message
news:3A3D8815.801E773D@cosc.canterbury.ac.nz...
> Andrew Dalke wrote:
> >
> > >>> bed = make_a(Furniture, Surface, Scenery)
>
> But how do I give it methods?

Most easily, actually -- in any of several handy ways.


>   bed(Furniture, Surface, Scenery):
>
>     def lie_on(self):
>       print "It's so comfy, you fall instantly" \
>         " asleep, and dream of a golden key sitting" \
>         " on a shelf in the pantry."

Using my version of make_a, i.e., to recap:


import new

def make_a(*classes, **attribs):
    return new.classobj('blob', classes, attribs)()

class Furniture:
     def comfy(self): return 1

class Surface:
    def genus(self): return 0  # Imagine a spherical cow...

class Scenery:
    def description(self): return "boring"

bed = make_a(Furniture, Surface, Scenery)


you have a range of choices, e.g., the most explicit:

def anewmethodjustforbed(self):
    print "elegant and comfy"
bed.lie_on = new.instancemethod(anewmethodjustforbed,
    bed, bed.__class__)


or, a tad less explicitly but perhaps more simply:

bed.__class__.lie_on = anewmethodjustforbed

which takes advantage of the implicit function->method
coercion [which happens when a reference to a function
is bound to a *class*'s attribute -- not an _instance_
attribute], and of course of the fact that instance 'bed'
is the sole instance of its class, so, in order to affect
that instance's behavior, we're at liberty to tweak its
class's:-).

It's just an issue of preferred style.  If one is using
the new module to build the class for object 'bed', I
think it might be more consistent to keep using the same
module also for building new methods to assign on the
fly; if one is using Andrew's original suggestion and
building that class less explicitly, then the implicit
coercion based approach might be better.


Note that my version of function make_a takes keyword
arguments and turns them into class-attributes for
the new class, so, if you already know what methods
you want to add to 'bed' as you generate it, another
alternative is to take advantage of that:

bed = make_a(Furniture, Surface, Scenery,
        lie_on=anewmethodjustforbed)


Of course you'll want to factor things appropriately.
If you have many methods that just print out stuff
while ignoring self, or using self just for read
access to instance data attributes, etc, you might
build a function encapsulating that:

def printout(self, message):
    print message % self.__dict__

and use it to build all on-the-fly methods of this
kind:

bed = make_a(Furniture, Surface, Scenery,
        lie_on=lambda self: printout(self, "whatever"))

or you might prefer a closure-factory approach,
rather than the lambda approach:

def printout_maker(message):
    def printout(self, message=message):
        print message % self.__dict__
    return printout

bed = make_a(Furniture, Surface, Scenery,
        lie_on=printout_maker("whatever"))

or, of course, the closure-factory could also use
module new rather than the implicit approach I've
taken here (which strictly parallel's Andrew's
original suggestion for make_a, except that here
we're using a local function rather than a local
class as in his case).


I think that some one out of these approaches, or
some variant thereof, will probably meet all kinds
of "how do I add a method" requirements.


Alex



In This Thread

Prev Next