Re: Setting Class Methods Using Strings
On Mar 12, 11:29 pm, Demonic Software <demonic.softw...@gmail.com>
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 .
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
|