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.
Alle lunedì 16 aprile 2007, Skye Weir-mathewes ha scritto:
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.
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?
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:
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.
···
On 4/16/07, Stefano Crocco <stefano.crocco@alice.it> wrote:
Alle lunedì 16 aprile 2007, Skye Weir-mathewes ha scritto:
> 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?
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:
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
···
On Apr 17, 7:16 am, Stefano Crocco <stefano.cro...@alice.it> wrote:
Alle lunedì 16 aprile 2007, Skye Weir-mathewes ha scritto:
> 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.
> 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?
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:
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
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.