Call a Function


#1

Hello,

I currently have an array of strings. Let’s say, for example, my array
contains the following:

                        ['one', 'two', 'three']

Each element in my array is the name of a function in my program. I
want to call the functions, using the array element. So for example,
lets say that my array is named ‘numArray’. I want to call the function
in my program named ‘one’. I am now trying numArray[0]. Is there a way
to make the numArray[0] be recognized as ‘one’ and call the function?
If my question is not clear, I can elaborate. Thanks in advance for all
help.

  • Shelton

#2

Jason S. wrote:

I currently have an array of strings. Let’s say, for example, my array
contains the following:

                        ['one', 'two', 'three']

Each element in my array is the name of a function in my program. I want
to call the functions, using the array element.

Object#send is the method you want. It takes a method name (follows by a
list
of arguments, if there are any) as an argument and calls that method on
the
receiver.

HTH,
Sebastian


#3

On Feb 3, 2009, at 3:39 PM, Jason S. wrote:

example, lets say that my array is named ‘numArray’. I want to call
the function in my program named ‘one’. I am now trying
numArray[0]. Is there a way to make the numArray[0] be recognized
as ‘one’ and call the function? If my question is not clear, I can
elaborate. Thanks in advance for all help.

Convert the string to a symbol and send it to the appropriate object.

send( numArray[0].to_sym )
=> NoMethodError: undefined method ‘one’ for main:Object

def one; puts “One!”; end
=> nil

send( numArray[0].to_sym )
One!
=> nil


#4

Use “eval”.

irb(main):001:0> def one
irb(main):002:1> puts “1”
irb(main):003:1> end
=> nil
irb(main):004:0> def two
irb(main):005:1> puts “2”
irb(main):006:1> end
=> nil
irb(main):007:0> metharray = [‘one’, ‘two’]
=> [“one”, “two”]
irb(main):008:0> metharray.each { |e| eval e }
1
2
=> [“one”, “two”]


#5

Convert the string to a symbol and send it to the appropriate object.
That isn’t even necessary, sending a string works just as fine.


#6

Hi –

On Wed, 4 Feb 2009, Matthew M. wrote:

Each element in my array is the name of a function in my program. I want
to call the functions, using the array element. So for example, lets say
that my array is named ‘numArray’. I want to call the function in my
program named ‘one’. I am now trying numArray[0]. Is there a way to make
the numArray[0] be recognized as ‘one’ and call the function? If my
question is not clear, I can elaborate. Thanks in advance for all help.

Convert the string to a symbol and send it to the appropriate object.

No need to convert it. send will take a string.

David


David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Coming in 2009: The Well-Grounded Rubyist (http://manning.com/black2)

http://www.wishsight.com => Independent, social wishlist management!


#7

On Feb 3, 2009, at 4:00 PM, Dominik H. wrote:

Convert the string to a symbol and send it to the appropriate object.
That isn’t even necessary, sending a string works just as fine.

Yeah, after the fact, I tried it like you say. For some reason, I had
the impression that strings didn’t auto-convert to symbols.


#8

Use “eval”.
No, please do not.
Using eval is not necessary most of the time, especially in this
case where you got the send method.


#9

Hi –

On Wed, 4 Feb 2009, Matthew M. wrote:

On Feb 3, 2009, at 4:00 PM, Dominik H. wrote:

Convert the string to a symbol and send it to the appropriate object.
That isn’t even necessary, sending a string works just as fine.

Yeah, after the fact, I tried it like you say. For some reason, I had the
impression that strings didn’t auto-convert to symbols.

The documentation is misleading; it specifies the argument as a
symbol, but it can be either. (And I consider that a feature; I don’t
think it’s just working by chance.)

David


David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Coming in 2009: The Well-Grounded Rubyist (http://manning.com/black2)

http://www.wishsight.com => Independent, social wishlist management!


#10

Wouldn’t you have to pass in the calling context (self from the
callers pov) if you were deffing your methods without a class? Ie
needs to k ow the object to send on, no? :slight_smile:

Blog: http://random8.zenunit.com/
Learn rails: http://sensei.zenunit.com/

On 04/02/2009, at 8:46 AM, Sebastian H.


#11

Julian L. wrote:

Wouldn’t you have to pass in the calling context (self from the
callers pov) if you were deffing your methods without a class?

self from the callers pov is also self from send’s pov if you invoke it
without an explicit receiver. So no, you don’t.

HTH,
Sebastian