# Function call using reflection

**URL:** <https://www.ruby-forum.com/t/function-call-using-reflection/193606>\
**Category:** Ruby\
**Created:** [August 20, 2010, 1:12pm UTC](https://www.ruby-forum.com/t/function-call-using-reflection/193606 "2010-08-20T13:12:53Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![raj\_plays](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/838e76/32.png) [@raj\_plays](https://www.ruby-forum.com/u/raj_plays)\
**Post date:** [August 20, 2010, 1:12pm UTC](https://www.ruby-forum.com/t/function-call-using-reflection/193606/1 "2010-08-20T13:12:53Z")

</div>

Hi,  
I get each part of the following command in a string at runtime  
Mod1::Util.parser1(“log.txt”)

So I have the following strings:  
s1 = “Mod1”  
s2 = “Util”  
s3 = “parser1”  
s4 = “log.txt”

Now I want to prepare the command and execute it at runtime.

Object::const\_get(s1 + “::” + s2 + “.” + s3 + “(”" + s4 + “”)")  
does not work.

Please help…

---

<div class="post-metadata">

**Author:** ![raj\_plays](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/838e76/32.png) [@raj\_plays](https://www.ruby-forum.com/u/raj_plays)\
**Post date:** [August 20, 2010, 1:38pm UTC](https://www.ruby-forum.com/t/function-call-using-reflection/193606/2 "2010-08-20T13:38:19Z")

</div>

2010/8/20 Rajarshi C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Now I want to prepare the command and execute it at runtime.
> 
> Object::const\_get(s1 + “::” + s2 + “.” + s3 + “("” + s4 + “")”)  
> does not work.

const\_get will only resolve a constant (as the name indicates). You  
could either use eval instead but I recommend the more robust and  
secure version with const\_get and send.

Object::const\_get(s1).const\_get(s2).send(s3, s4)

Cheers

robert

---

<div class="post-metadata">

**Author:** ![raj\_plays](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/838e76/32.png) [@raj\_plays](https://www.ruby-forum.com/u/raj_plays)\
**Post date:** [August 20, 2010, 1:44pm UTC](https://www.ruby-forum.com/t/function-call-using-reflection/193606/3 "2010-08-20T13:44:10Z")

</div>

On Fri, Aug 20, 2010 at 1:12 PM, Rajarshi C.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Now I want to prepare the command and execute it at runtime.
> 
> Object::const\_get(s1 + “::” + s2 + “.” + s3 + “("” + s4 + “")”)  
> does not work.

If you know the first one is a module and the second a class, you could  
try:

irb(main):001:0\> module A  
irb(main):002:1\> class B  
irb(main):003:2\> def parse(param)  
irb(main):004:3\> puts “parsing #{param} …”  
irb(main):005:3\> end  
irb(main):006:2\> end  
irb(main):007:1\> end  
=\> nil  
irb(main):008:0\> s1 = “A”  
=\> “A”  
irb(main):009:0\> s2 = “B”  
=\> “B”  
irb(main):010:0\> s3 = “parse”  
=\> “parse”  
irb(main):011:0\> s4 = “filename.txt”  
=\> “filename.txt”  
irb(main):014:0\> m = Object.const\_get(s1)  
=\> A  
irb(main):015:0\> c = m.const\_get(s2)  
=\> A::B  
irb(main):017:0\> c.new.send(s3, s4)  
parsing filename.txt …

Jesus.

---

<div class="post-metadata">

**Author:** ![raj\_plays](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/838e76/32.png) [@raj\_plays](https://www.ruby-forum.com/u/raj_plays)\
**Post date:** [August 20, 2010, 1:53pm UTC](https://www.ruby-forum.com/t/function-call-using-reflection/193606/4 "2010-08-20T13:53:55Z")

</div>

Thank you, Robert and Jesus,  
for the theory and the code.

🙂
