Re: best way to dynamically create new instance methods

From: James Edward G. II [mailto:[email protected]]

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.

:slight_smile:

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.)

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

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

:slight_smile:

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 G. II

Hi –

On Tue, 12 Dec 2006, James Edward G. II wrote:

end

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

And keep a little card in your pocket to remind you which does
which… :slight_smile:

David

On Tue, Dec 12, 2006 at 07:28:50AM +0900, James Edward G. II wrote:

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 } }