42

I have two methods defined in my ruby file.

def is_mandatory(string)
      puts xyz
end
def is_alphabets(string)
      puts abc 
end 

An array containing the names of the methods.

    methods = ["is_mandatory", "is_alphabets"]

When I do the following

    methods.each do |method| puts method.concat("(\"abc\")") end 

It just displays, is_mandatory("abc") is_alphabets("abc") rather than actually calling the method.

How can i convert the string to method name? Any help is greatly appreciated.

Cheers!!

verdure
  • 3,201
  • 6
  • 26
  • 27
  • 4
    On a side note, the Ruby way of doing is_* methods is by using a question mark rather than the prefix "is", i.e. `mandatory?` and `alphabets?`. – Jon Cairns Oct 24 '12 at 09:42

4 Answers4

62

Best way is probably:

methods.each { |methodName| send(methodName, 'abc') }

See Object#send

Sapphire_Brick
  • 1,560
  • 12
  • 26
Chowlett
  • 45,935
  • 20
  • 116
  • 150
15

Try using "send".

methods.each do |method| 
  self.send(method, "abc")
end 
Aurril
  • 2,469
  • 2
  • 24
  • 38
2

All previous solutions with send are fine but it is recommended to use public_send instead (otherwise you can be calling private methods).

Example:

'string'.public_send(:size)
=> 6
Gerard Morera
  • 799
  • 6
  • 12
0

You can also add hash to send parameters to the method.

send("method_name", "abc", {add more parameters in this hash})
vikas95prasad
  • 1,234
  • 1
  • 12
  • 37