From: Todd Benson Date: 2008-03-13T16:14:03+09:00 Subject: Re: Setting Class Methods Using Strings On Thu, Mar 13, 2008 at 12:29 AM, Demonic Software wrote: > Hello, > > First question: > With the 'print 'foo_method called with \#{arg}', is there a way to escape > the "#" so that arg will not be evaluated until after the statement is > evalled? For example: > > Let c be "'print 'foo_method called with \#{arg}'" > > eval(c) => print 'foo_method called with #{arg}' > > > > Second (Main Question) > Is it possible to set an object's methods with raw code and a method name? > I am not sure how to Google for an example on this, so I will just show an > example. > > == Here is an empty class definition Foo, and later on I will want to > assign/add/set a method in an instantiated Foo object == > > class Foo > end > > == Now I want to set a method in an instantiated Foo with code, so that I > can call f == > > code = "def foo_method(arg) > print 'foo_method called with #{arg}' > end" > > f = Foo.new() > #... > #code to set a method in f > #... > > f.foo_method("for the win!") > > == > > Is this possible? or Do I need create a string and add the method in like > the following example? > > code = "\ndef foo_method(arg) > print 'foo_method called with \#{arg}' > end\n" > foo = "class Foo " + code + " end" > > eval(foo) > f = Foo.new() > f.foo_method("for the win!") > > > > Thanks in advance for your help. Unless you absolutely _have_ to create a string (like you're holding code in a database that is to be executed)... class Foo end f = Foo.new g = Foo.new def f.bar arg; puts arg; end f.bar "hi" # "hi" g.bar "hi" # undefined method error It can also be done like this after the class construction... class << f def bar arg; puts arg; end end I don't think this case is a good use of #eval, but it depends on what you're doing. hth, Todd