Is my method defined?

F

Fredrik

I have a method by the name methodA. I want to access this method like
this

a = 'methodA'
eval(a)

But how do I know if the variable a actually holds the name of a
defined method? An exception is raised if I try to run eval(a) with an
incorrect method name, but I need to know this before I call eval(a).
How do I do that?

I found this solution:

def method?(arg)
begin
method(a)
rescue
nil
end
end

which does work, but why is this function "method?" not already in the
Ruby language then?
 
S

Stefano Crocco

Alle Saturday 13 September 2008, Fredrik ha scritto:
I have a method by the name methodA. I want to access this method like
this

a = 'methodA'
eval(a)

But how do I know if the variable a actually holds the name of a
defined method? An exception is raised if I try to run eval(a) with an
incorrect method name, but I need to know this before I call eval(a).
How do I do that?

I found this solution:

def method?(arg)
begin
method(a)
rescue
nil
end
end

which does work, but why is this function "method?" not already in the
Ruby language then?

In my opinion, for two reasons:
1) the name is misleading. Methods ending in ? usually are method which only
answer a Yes/No question, without taking any action. The method you propose,
instead, perform an action and doesn't give an answer to a question. If I were
a user seeing a method called 'method?', I'd think it's a synonym for
respond_to?, or similar to it.
2) This functionality isn't needed very often, and it's very easy to write
your own method if you need it, as you have done.

Stefano
 
S

Sebastian Hungerecker

Fredrik said:
I have a method by the name methodA. I want to access this method like
this

a = 'methodA'
eval(a)

You should use send if a only contains a methodname.
But how do I know if the variable a actually holds the name of a
defined method?

respond_to? method_name

HTH,
Sebastian
 
F

Fredrik

You should use send if a only contains a methodname.


respond_to? method_name

HTH,
Sebastian

I got it! respond_to? is what I was looking for. Thanks!
I will open my Ruby book and look into that send thing...

/Fredrik
 
S

Sebastian Hungerecker

Fredrik said:
I will open my Ruby book and look into that send thing...

send is quite simple actually:
send("foo") is the same as foo
send("foo", bar) is the same as foo(bar)
object.send("foo", bar) is the same as object.foo(bar)
That's basically it.

HTH,
Sebastian
 
D

David A. Black

Hi --

send is quite simple actually:
send("foo") is the same as foo
send("foo", bar) is the same as foo(bar)
object.send("foo", bar) is the same as object.foo(bar)
That's basically it.

Almost :)
NoMethodError: private method `x' called for #<C:0x3c95ec>


David

--
Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
Advancing with Rails January 19-22 Fort Lauderdale, FL *
* Co-taught with Patrick Ewing!
See http://www.rubypal.com for details and updates!
 
F

Fredrik

send is quite simple actually:
send("foo") is the same as foo
send("foo", bar) is the same as foo(bar)
object.send("foo", bar) is the same as object.foo(bar)
That's basically it.

HTH,
Sebastian

So how is send better than eval then?
send("foo")
eval("foo")
Same, right?
 
F

Fredrik

You should use send if a only contains a methodname.


respond_to? method_name

HTH,
Sebastian

Now I am utterly confused. Can anyone explain THIS behaviour :

### File : foo.rb ###
def requiredfoo
"I'm here!"
end
#####################

irb> require 'foo.rb'
irb> respond_to? 'requiredfoo'
=> false

irb> def foo ; "I'm here!" ; end
irb> respond_to? 'foo'
=> true

That doesn't make sense at all, right?

/Fredrik
 
S

Sebastian Hungerecker

Fredrik said:
So how is send better than eval then?

It's more specific. And you can call the method on an object other than self
without string manipulation.

send("foo")
eval("foo")
Same, right?

Yes, but
send("system('rm -rf /')") # Error
eval("system('rm -rf /')") # Works
 
S

Sebastian Hungerecker

Fredrik said:
irb> require 'foo.rb'
irb> respond_to? 'requiredfoo'
=> false

irb> def foo ; "I'm here!" ; end
irb> respond_to? 'foo'
=> true

respond_to? returns false for private methods. If you define a method outside
of a class/module, it's a private instance method of Object by default, except
when you define it in irb in which case it will be public for whatever reason.

HTH,
Sebastian
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,054
Latest member
LucyCarper

Latest Threads

Top