Calling method by name.

Jacob Carlborg doob at me.com
Sun Feb 6 02:33:37 PST 2011


On 2011-02-04 20:03, spir wrote:
> On 02/04/2011 04:33 PM, Jacob Carlborg wrote:
>>
>> I recommend looking at Ruby, it has very good support for runtime
>> reflection.
>> ActiveRecord in Rails is hevaly based on runtime reflection. For
>> example, given
>> the following Ruby class:
>>
>> class Post < ActiveRecord::Base
>> end
>>
>> The class "Post" maps to the database table "posts", no configuration is
>> necessary. Then you can use the column names in the table as fields to
>> set and
>> get data, like this:
>>
>> post = Post.new
>> post.title = "some title"
>> post.body = "the body"
>> post.save # will update the database
>>
>> All this is done using runtime reflection. Then you can query the
>> database,
>> also using runtime reflection:
>>
>> Post.find_by_name_and_body("some title", "the body")
>>
>> Will find the first row where "title" and "body" matches the given
>> values.
>
> FWIW, python example of "Calling method by name" (using no exotic feature):
>
> class C:
> def __init__(self, x):
> self.x = x
> def write (self, thing):
> print "%s == %s ? %s" \
> %(self.x,thing, self.x==thing)
>
> def runMethodWithArgs (object, name, *args):
> method = getattr(object, name)
> method(*args)
>
> c= C(1.11)
> runMethodWithArgs(c, "write", 2.22)
> # --> 1.11 == 2.22 ? False
>
> (Explanations if needed.)
>
> Denis

Actually I never showed how to do "call by name" in Ruby, just how it 
can be used. Ruby has "built in" (not in the language but in the Object 
class) support for this:

p Object.new.send(:to_s) # :to_s is a symbol, basically an immutable 
lightweight string

The above will print something like: "#<Object:0x101279bb8>"

To implement the "find_by" methods used in my previous examples you 
implement the "method_missing" method:

class Foo
     def method_missing (method, *args, &block)
         p method, args
     end
end

Foo.new.bar 3, 4

Will print:

:bar
[3, 4]

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list