Calling a Method From a String With the Method's Name in Ruby Calling a Method From a String With the Method's Name in Ruby ruby ruby

Calling a Method From a String With the Method's Name in Ruby


To call functions directly on an object

a = [2, 2, 3]a.send("length")# ora.public_send("length")

which returns 3 as expected

or for a module function

FileUtils.send('pwd')# orFileUtils.public_send(:pwd)

and a locally defined method

def load()    puts "load() function was executed."endsend('load')# orpublic_send('load')

Documentation:


Three Ways: send / call / eval - and their Benchmarks

Typical invocation (for reference):

s= "hi man"s.length #=> 6

Using send

s.send(:length) #=> 6

Using call

method_object = s.method(:length) p method_object.call #=> 6

Using eval

eval "s.length" #=> 6

 

Benchmarks

require "benchmark" test = "hi man" m = test.method(:length) n = 100000 Benchmark.bmbm {|x|   x.report("call") { n.times { m.call } }   x.report("send") { n.times { test.send(:length) } }   x.report("eval") { n.times { eval "test.length" } } } 

...as you can see, instantiating a method object is the fastest dynamic way in calling a method, also notice how slow using eval is.

############################################   The results########################################Rehearsal ----------------------------------------#call   0.050000   0.020000   0.070000 (  0.077915)#send   0.080000   0.000000   0.080000 (  0.086071)#eval   0.360000   0.040000   0.400000 (  0.405647)#------------------------------- total: 0.550000sec#          user     system      total        real#call   0.050000   0.020000   0.070000 (  0.072041)#send   0.070000   0.000000   0.070000 (  0.077674)#eval   0.370000   0.020000   0.390000 (  0.399442)

Credit goes to this blog post which elaborates a bit more on the three methods and also shows how to check if the methods exist.


Use this:

> a = "my_string"> meth = a.method("size")> meth.call() # call the size method=> 9

Simple, right?

As for the global, I think the Ruby way would be to search it using the methods method.