[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Is my method defined?

Fredrik

9/13/2008 9:17:00 AM

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?
9 Answers

Stefano Crocco

9/13/2008 9:24:00 AM

0

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

Sebastian Hungerecker

9/13/2008 9:25:00 AM

0

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: sepp2k@jabber.org
ICQ: 205544826

Fredrik

9/13/2008 10:13:00 AM

0

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

Sebastian Hungerecker

9/13/2008 10:37:00 AM

0

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: sepp2k@jabber.org
ICQ: 205544826

David A. Black

9/13/2008 10:48:00 AM

0

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.r... for details and updates!

Fredrik

9/14/2008 2:51:00 AM

0

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?

Fredrik

9/14/2008 3:45:00 AM

0

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

Sebastian Hungerecker

9/14/2008 8:08:00 AM

0

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: sepp2k@jabber.org
ICQ: 205544826

Sebastian Hungerecker

9/14/2008 8:12:00 AM

0

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: sepp2k@jabber.org
ICQ: 205544826