Forum: Ruby iterate through an array of method names to an object

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
B17ac0f8a0d180c9f817805209b92eca?d=identicon&s=25 Skye Weir-Mathews (sheepfunk)
on 2007-04-16 23:11
I've been trying to create a iterator that will run through and array of
method names, sending each one to an object. For some reason the object
doesn't like the method names if I send them via an iterator, but if I
spell each one out, it works fine. When I try to use the iterator I get
and error indicating that ruby doesn't think my method names actually
name a method.

Here's some of my code:

functions = ["addHeadersAndFooters", "addListNameToSubject", "admin",
"allowCrossPosting ", "allowDuplicatePosts ", "allowInfo ",
"anyoneCanPost "]

  functions.each do |funk|
    puts name_o_my_object.funk
  end

gives me the following error:

undefined method `funk' for #<SOAP::Mapping::Object:0x5585bd8>
(NoMethodError)

but if I write somthing like:

  functions.each do |funk|
    puts name_o_my_object.addHeadersAndFooters
  end

the iterator works fine, so... what's up with that?
C40020a47c6b625af6422b5b1302abaf?d=identicon&s=25 Stefano Crocco (crocco)
on 2007-04-16 23:16
(Received via mailing list)
Alle lunedì 16 aprile 2007, Skye Weir-mathewes ha scritto:
> "allowCrossPosting ", "allowDuplicatePosts ", "allowInfo ",
>
> but if I write somthing like:
>
>   functions.each do |funk|
>     puts name_o_my_object.addHeadersAndFooters
>   end
>
> the iterator works fine, so... what's up with that?

In the first case, you write name_o_my_object.funk. In this case, ruby
tries
to call a method called funk on the object name_o_my_object. What you
need to
do is:

puts name_o_my_object.send(funk)

I hope this helps

Stefano
B17ac0f8a0d180c9f817805209b92eca?d=identicon&s=25 Skye Weir-Mathews (sheepfunk)
on 2007-04-16 23:31
That totally worked, thank you so much
E34b5cae57e0dd170114dba444e37852?d=identicon&s=25 Logan Capaldo (Guest)
on 2007-04-17 04:43
(Received via mailing list)
On 4/16/07, Stefano Crocco <stefano.crocco@alice.it> wrote:
> >
> > undefined method `funk' for #<SOAP::Mapping::Object:0x5585bd8>
> In the first case, you write name_o_my_object.funk. In this case, ruby
> tries
> to call a method called funk on the object name_o_my_object. What you need
> to
> do is:
>
> puts name_o_my_object.send(funk)
>
> I hope this helps
>
> Stefano


Just to elaborate on Stefano's response a little, consider this
scenario:

class A
   def funk
       "funk"
   end
end

a = A.new
p a.funk # should this be an error since there is no variable called
funk?

functions.each do |funk|
   p a.funk # which funk do you think this should refer to?
end

Clearly it has to be one or the other. For the code you posted to work
we'd
have to do something like
a.("funk") or
f = "funk"
a.f

everytime we wanted to call a method.
B01fdd12039d82427a4af02360ef5571?d=identicon&s=25 cammo (Guest)
on 2007-04-17 14:32
(Received via mailing list)
But also the send method will expect to get a symbol not a string so
you'll need to do something like

functions.each do |funk|
    funk.to_sym
    puts name_o_my_object.send(funk)
  end

I tried that in irb and it worked so fingers crossed should work for
you too.

Cam
C40020a47c6b625af6422b5b1302abaf?d=identicon&s=25 Stefano Crocco (crocco)
on 2007-04-17 14:39
(Received via mailing list)
Alle martedì 17 aprile 2007, cammo ha scritto:
>
> Cam

send accepts both a string or a symbol. The documentation for
Object#send,
states

object.send(symbol, [args...])

and the documentation of Object class, says:

In the descriptions of Object's methods, the parameter symbol refers to
a
symbol, which is either a quoted string or a Symbol

Besides, your own code passes a string to send, since funk.to_sym
returns a
symbol, but doesn't change what is stored inside funk, so when funk is
passed
to send, it still contains a string.

Stefano
This topic is locked and can not be replied to.