From: Chris Shea Date: 2008-03-13T14:50:00+09:00 Subject: Re: Setting Class Methods Using Strings On Mar 12, 11:29 pm, Demonic Software wrote: > [Note: parts of this message were removed to make it a legal post.] > > 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. If you know when to use single quotes and when to use double quotes, yes to both: a = 1 c = 'puts "a = #{a}"' # => "puts \"a = \#{a}\"" eval(c) # >> a = 1 code = 'def foo_method(arg); puts "foo_method called with #{arg}"; end' class Foo; end Foo.class_eval(code) Foo.new.foo_method('hi') # >> foo_method called with hi Single-quoted strings do not perform interpolation, while double- quoted strings do. So if you juggle them for eval, you can have it do what you want. Of course, putting a backslash before the #{} in double- quoted strings will escape that so it doesn't perform the interpolation. Play around and you should get the hang of it quickly. And beware eval. Use carefully. HTH, Chris