Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Is my method defined?

Reply
Thread Tools

Is my method defined?

 
 
Fredrik
Guest
Posts: n/a
 
      09-13-2008
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?
 
Reply With Quote
 
 
 
 
Stefano Crocco
Guest
Posts: n/a
 
      09-13-2008
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

 
Reply With Quote
 
 
 
 
Sebastian Hungerecker
Guest
Posts: n/a
 
      09-13-2008
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
--
NP: Metallica - The Day That Never Comes
Jabber:
ICQ: 205544826

 
Reply With Quote
 
Fredrik
Guest
Posts: n/a
 
      09-13-2008
On Sep 13, 6:24*pm, Sebastian Hungerecker <sep...@googlemail.com>
wrote:
> 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
> --
> NP: Metallica - The Day That Never Comes
> Jabber: sep...@jabber.org
> 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
 
Reply With Quote
 
Sebastian Hungerecker
Guest
Posts: n/a
 
      09-13-2008
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
--
Jabber:
ICQ: 205544826

 
Reply With Quote
 
David A. Black
Guest
Posts: n/a
 
      09-13-2008
Hi --

On Sat, 13 Sep 2008, Sebastian Hungerecker 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

>> c.send("x")

=> nil
>> c.x

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!

 
Reply With Quote
 
Fredrik
Guest
Posts: n/a
 
      09-14-2008
On Sep 13, 7:37*pm, Sebastian Hungerecker <sep...@googlemail.com>
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.
>
> HTH,
> Sebastian
> --
> Jabber: sep...@jabber.org
> ICQ: 205544826


So how is send better than eval then?
send("foo")
eval("foo")
Same, right?
 
Reply With Quote
 
Fredrik
Guest
Posts: n/a
 
      09-14-2008
On Sep 13, 6:24*pm, Sebastian Hungerecker <sep...@googlemail.com>
wrote:
> 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
> --
> NP: Metallica - The Day That Never Comes
> Jabber: sep...@jabber.org
> 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
 
Reply With Quote
 
Sebastian Hungerecker
Guest
Posts: n/a
 
      09-14-2008
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

--
Jabber:
ICQ: 205544826

 
Reply With Quote
 
Sebastian Hungerecker
Guest
Posts: n/a
 
      09-14-2008
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
--
Jabber:
ICQ: 205544826

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
method def in method vs method def in block Kyung won Cheon Ruby 0 11-21-2008 08:48 AM
invoke a method by reflection£¬the method's parameters can not be ArrayList? jerry051 ASP .Net 2 08-02-2005 10:35 AM
BC30289: Statement cannot appear within a method body. End of method assumed. Carlos Oliveira ASP .Net 0 08-19-2004 07:51 PM
Difference between Delete method and RemoveRow method CW ASP .Net 0 04-01-2004 01:07 AM
ASP.NET: BC30289: Statement cannot appear within a method body. End of method assumed. Mike Wilmot ASP .Net 0 12-15-2003 07:49 PM



Advertisments