Is my method defined?

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?

Alle Saturday 13 September 2008, Fredrik ha scritto:

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

Fredrik wrote:

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

Fredrik wrote:

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

On Sep 13, 6:24 pm, Sebastian H. [email protected]
wrote:

defined method?

respond_to? method_name

HTH,
Sebastian

NP: Metallica - The Day That Never Comes
Jabber: [email protected]
ICQ: 205544826

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

On Sep 13, 7:37 pm, Sebastian H. [email protected]
wrote:

Sebastian

Jabber: [email protected]
ICQ: 205544826

So how is send better than eval then?
send(“foo”)
eval(“foo”)
Same, right?

On Sep 13, 6:24 pm, Sebastian H. [email protected]
wrote:

defined method?

respond_to? method_name

HTH,
Sebastian

NP: Metallica - The Day That Never Comes
Jabber: [email protected]
ICQ: 205544826

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

Fredrik wrote:

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

Fredrik wrote:

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

Hi –

On Sat, 13 Sep 2008, Sebastian H. wrote:

Fredrik wrote:

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.

Almost :slight_smile:

c.send(“x”)
=> nil

c.x
NoMethodError: private method `x’ called for #<C:0x3c95ec>

David