[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: best way to dynamically create new instance methods

Gavin Kistner

12/11/2006 10:19:00 PM

From: James Edward Gray II [mailto:james@grayproductions.net]
> Sent: Monday, December 11, 2006 3:15 PM
> To: ruby-talk ML
> Subject: Re: best way to dynamically create new instance methods

> >> def create_method(name)
> >> class << self; self end.send(:define_method, name) { |*args|
> args.first }
> >> end

Ooh, look at Mr. Fancy Pants, using his fancy #send to get around
private methods.

:)

Really, I'm writing this email not to praise or make fun, but to point
out that the above technique may not work when 1.9 rolls around.
(Assuming I remember correctly that 1.9 will/may change so that #send
honors the public/protected/private state of the method being invoked.)

3 Answers

James Gray

12/11/2006 10:29:00 PM

0

On Dec 11, 2006, at 4:19 PM, Gavin Kistner wrote:

> From: James Edward Gray II [mailto:james@grayproductions.net]
>> Sent: Monday, December 11, 2006 3:15 PM
>> To: ruby-talk ML
>> Subject: Re: best way to dynamically create new instance methods
>
>>>> def create_method(name)
>>>> class << self; self end.send(:define_method, name) { |*args|
>> args.first }
>>>> end
>
> Ooh, look at Mr. Fancy Pants, using his fancy #send to get around
> private methods.
>
> :)
>
> Really, I'm writing this email not to praise or make fun, but to point
> out that the above technique may not work when 1.9 rolls around.
> (Assuming I remember correctly that 1.9 will/may change so that #send
> honors the public/protected/private state of the method being
> invoked.)

Correct. In 1.9 you need to use funcall() in place of send().

James Edward Gray II

dblack

12/11/2006 10:34:00 PM

0

Mauricio Fernández

12/11/2006 11:55:00 PM

0

On Tue, Dec 12, 2006 at 07:28:50AM +0900, James Edward Gray II wrote:
> On Dec 11, 2006, at 4:19 PM, Gavin Kistner wrote:
> >>>> def create_method(name)
> >>>> class << self; self end.send(:define_method, name) { |*args|
> >>args.first }
> >>>> end
> >
> >Really, I'm writing this email not to praise or make fun, but to point
> >out that the above technique may not work when 1.9 rolls around.
> >(Assuming I remember correctly that 1.9 will/may change so that #send
> >honors the public/protected/private state of the method being
> >invoked.)
>
> Correct. In 1.9 you need to use funcall() in place of send().

I write such things this way nowadays for that reason:

class << self; self end.class_eval{ define_method(name){ |*args| args.first } }

--
Mauricio Fernandez - http://eige... - singular Ruby