Getting the 'Sender' or 'Caller' object of a method

P

Peter Laurens

Hi,

I am not having much luck in finding out how to get the calling object
of a method.

Is there an implicit way that a method can get a pointer to the object
that called it, or do I have to write that explicitly, manually
including a 'sender' parameter for the method call myself?

I have looked at 'caller' but can only coax a string out of it.

Thanks in advance for your kind help!

- Nex
 
R

Robert Klemme

2007/8/3 said:
Hi,

I am not having much luck in finding out how to get the calling object
of a method.

Is there an implicit way that a method can get a pointer to the object
that called it, or do I have to write that explicitly, manually
including a 'sender' parameter for the method call myself?

I have looked at 'caller' but can only coax a string out of it.

Depends on what you want to do. If it's for debugging purposes you
can use set_trace_func to keep track of callers or just trace the
whole program execution.

If you need it for your program logic then you should pass the caller
- either as method parameter or set it as an attribute before the
call. Depends on what you do which is more appropriate.

Kind regards

robert
 
R

Robert Dober

Hi,

I am not having much luck in finding out how to get the calling object
of a method.

Is there an implicit way that a method can get a pointer to the object
that called it, or do I have to write that explicitly, manually
including a 'sender' parameter for the method call myself?

I have looked at 'caller' but can only coax a string out of it.

Thanks in advance for your kind help!

- Nex
Hmm maybe binding_of_caller might help, as far as I know Facet
implements it, and Why did so too, maybe just google it, I would not
know which one to recommend.

HTH
Robert
 
P

Peter Laurens

Thanks to the both of you - it appears as though my best way to do this
is just manually then, via a passed 'sender' parameter.

Thanks!

- Nex
 
W

Wolfgang Nádasi-donner

Peter said:
I am not having much luck in finding out how to get the calling object
of a method.

I'm not sure to understand what you mean, because inside a method
"meth", which is used/called by an object "obj" by "obj.meth", the
object can be referenced by "self".

Wolfgang Nádasi-Donner
 
A

ara.t.howard

Hi,

I am not having much luck in finding out how to get the calling object
of a method.

Is there an implicit way that a method can get a pointer to the object
that called it, or do I have to write that explicitly, manually
including a 'sender' parameter for the method call myself?

I have looked at 'caller' but can only coax a string out of it.

Thanks in advance for your kind help!

- Nex

in many contexts this will work:

require 'binding_of_caller'

def method
caller = Binding_of_caller{|binding| eval 'self', binding}
end

notably NOT class methods though...

a @ http://drawohara.com/
 
T

Trans

in many contexts this will work:

require 'binding_of_caller'

def method
caller = Binding_of_caller{|binding| eval 'self', binding}
end

notably NOT class methods though...


You can always take a block and get the binding from it:

def method(&b)
callers_binding = b.send:)binding)
end

I works always. Yes, it means passing a block, but sometimes that's
useful anyway.

T.
 
B

Ben Bleything

Hmm maybe binding_of_caller might help, as far as I know Facet
implements it, and Why did so too, maybe just google it, I would not
know which one to recommend.

IIRC, binding of caller hasn't worked since 1.8.4. It relied on a bug
that was fixed.

Ben
 
B

Ben Bleything

IIRC, binding of caller hasn't worked since 1.8.4. It relied on a bug
that was fixed.

My mistake, I was thinking of Binding#of_caller, which was a different
thing, heh.

Ben
 
A

ara.t.howard

You can always take a block and get the binding from it:

def method(&b)
callers_binding = b.send:)binding)
end

I works always. Yes, it means passing a block, but sometimes that's
useful anyway.

??

cfp:~ > cat a.rb
def a &b
eval 'self', b.send:)binding)
end

require 'binding_of_caller'
def b
Binding.of_caller{|binding| eval 'self', binding}
end

p self
p a
p b


cfp:~ > ruby a.rb
main
nil
main


cfp:~ > ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1]


am i misunderstanding?


a @ http://drawohara.com/
 
R

Robert Dober

You can always take a block and get the binding from it:

def method(&b)
callers_binding = b.send:)binding)
end

I works always. Yes, it means passing a block, but sometimes that's
useful anyway.

??

cfp:~ > cat a.rb
def a &b
eval 'self', b.send:)binding)
end

require 'binding_of_caller'
def b
Binding.of_caller{|binding| eval 'self', binding}
end

p self
p a
p b


cfp:~ > ruby a.rb
main
nil
main


cfp:~ > ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1]


am i misunderstanding?
yup, Tom asks us to kindly pass him a block

p a {}

one could consider it cheating, but it is incredibly useful, I did not
know about it.

Thx and Cheers
Robert
 

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

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top