Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Get the caller of a class

Reply
Thread Tools

Get the caller of a class

 
 
Mario Ruiz
Guest
Posts: n/a
 
      08-01-2008
I have something like:

Class MyClass
def doit

caller= How can I do it

puts 'I was called from: ' + caller.class
puts 'the value of the @variab is: ' + caller.variab.to_s()
end
end

Class MyCaller
attr_reader: :variab
attr_writer: :variab

def callit
@variab="example"
result=MyClass.doit
end
end


Is there any way to do it??

Thank you
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Mario Ruiz
Guest
Posts: n/a
 
      08-01-2008
Sorry the code was wrong, it should be:

class MyClass
def MyClass.doit

caller= How can I do it

puts 'I was called from: ' + caller.class.to_s()
puts 'the value of the @variab is: ' + caller.variab.to_s()
end
end

class MyCaller
attr_reader :variab
attr_writer :variab

def initialize
puts 'starts'
end
def callit
@variab="example"
result=MyClass.doit
end
end

MyCaller.new().callit
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Robert Klemme
Guest
Posts: n/a
 
      08-01-2008
2008/8/1 Mario Ruiz <(E-Mail Removed)>:

There is no such thing as the "caller of a class": a class can be used
by many clients and only methods are actually "called". "caller" is
actually already defined. See whether this helps:

15:19:02 bas$ irb
Ruby version 1.8.7
irb(main):001:0> def a(n) b(n) end
=> nil
irb(main):002:0> def b(n) caller(n) end
=> nil
irb(main):003:0> 3.times {|i| puts i, a(i), "----"}
0
(irb):2:in `b'
(irb):1:in `a'
(irb):4:in `irb_binding'
(irb):4:in `times'
(irb):4:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52
----
1
(irb):1:in `a'
(irb):4:in `irb_binding'
(irb):4:in `times'
(irb):4:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52
----
2
(irb):4:in `irb_binding'
(irb):4:in `times'
(irb):4:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52
----
=> 3


Kind regards

robert


--
use.inject do |as, often| as.you_can - without end

 
Reply With Quote
 
shadowfirebird@gmail.com
Guest
Posts: n/a
 
      08-01-2008
This is profoundly unhelpful, I know: but perhaps you should consider
redesigning your method so that it doesn't care where it was called
from? That would be more in line with Object Oriented design.

You might find that it belongs on another class, for example the
parent class of all the classes that you are currently considering
calling it from.

Or you could leave it where it is and pass some sort of mode string, instead:

def doit(mode)
case mode
when :full then ...
when :quick then ...
end
end


On 8/1/08, Robert Klemme <(E-Mail Removed)> wrote:
> 2008/8/1 Mario Ruiz <(E-Mail Removed)>:
>
> There is no such thing as the "caller of a class": a class can be used
> by many clients and only methods are actually "called". "caller" is
> actually already defined. See whether this helps:
>
> 15:19:02 bas$ irb
> Ruby version 1.8.7
> irb(main):001:0> def a(n) b(n) end
> => nil
> irb(main):002:0> def b(n) caller(n) end
> => nil
> irb(main):003:0> 3.times {|i| puts i, a(i), "----"}
> 0
> (irb):2:in `b'
> (irb):1:in `a'
> (irb):4:in `irb_binding'
> (irb):4:in `times'
> (irb):4:in `irb_binding'
> /usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
> /usr/lib/ruby/1.8/irb/workspace.rb:52
> ----
> 1
> (irb):1:in `a'
> (irb):4:in `irb_binding'
> (irb):4:in `times'
> (irb):4:in `irb_binding'
> /usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
> /usr/lib/ruby/1.8/irb/workspace.rb:52
> ----
> 2
> (irb):4:in `irb_binding'
> (irb):4:in `times'
> (irb):4:in `irb_binding'
> /usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
> /usr/lib/ruby/1.8/irb/workspace.rb:52
> ----
> => 3
>
>
> Kind regards
>
> robert
>
>
> --
> use.inject do |as, often| as.you_can - without end
>
>



--
Me, I imagine places that I have never seen / The colored lights in
fountains, blue and green / And I imagine places that I will never go
/ Behind these clouds that hang here dark and low
But it's there when I'm holding you / There when I'm sleeping too /
There when there's nothing left of me / Hanging out behind the
burned-out factories / Out of reach but leading me / Into the
beautiful sea

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      08-01-2008
2008/8/1 <(E-Mail Removed)>:
> This is profoundly unhelpful, I know: but perhaps you should consider
> redesigning your method so that it doesn't care where it was called
> from? That would be more in line with Object Oriented design.


Good point! After rereading the original posting I would suggest the
same. Just pass on the calling instance or the bit of data that the
method needs. That's what method arguments are for.

Kind regards

robert

--
use.inject do |as, often| as.you_can - without end

 
Reply With Quote
 
Mario Ruiz
Guest
Posts: n/a
 
      08-01-2008
I know that way.... but I would like to know if it is possible to do it
without passing the argument to the method.
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
botp
Guest
Posts: n/a
 
      08-01-2008
On Fri, Aug 1, 2008 at 10:25 PM, Mario Ruiz <(E-Mail Removed)> wrote:
> I know that way.... but I would like to know if it is possible to do it
> without passing the argument to the method.


try #caller

botp@jedi-hopeful:~$ qri caller
---------------------------------------------------------- Kernel#caller
caller(start=1) => array
------------------------------------------------------------------------
Returns the current execution stack---an array containing strings
in the form ``file:line'' or ``file:line: in `method'''. The
optional start parameter determines the number of initial stack
entries to omit from the result.

def a(skip)
caller(skip)
end
def b(skip)
a(skip)
end
def c(skip)
b(skip)
end
c(0) #=> ["prog:2:in `a'", "prog:5:in `b'", "prog:8:in `c'",
"prog:10"]
c(1) #=> ["prog:5:in `b'", "prog:8:in `c'", "prog:11"]
c(2) #=> ["prog:8:in `c'", "prog:12"]
c(3) #=> ["prog:13"]

hth.
kind regards -botp

 
Reply With Quote
 
Pit Capitain
Guest
Posts: n/a
 
      08-02-2008
Mario, there once was a library called binding_of_caller, which I
think could do what you wanted, but I think it doesn't work anymore
with recent Ruby versions.

Regards,
Pit

 
Reply With Quote
 
Mario Ruiz
Guest
Posts: n/a
 
      08-05-2008
Thanks to everybody.

I thought it could be an easier way to do it so I'll just pass a 'self'
parameter.

Thanks.
--
Posted via http://www.ruby-forum.com/.

 
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
How to get name of 'Caller' class from 'Called' class (ASP.NET) =?Utf-8?B?SG1udA==?= ASP .Net 5 06-25-2006 03:44 PM
Nested Class, Member Class, Inner Class, Local Class, Anonymous Class E11 Java 1 10-12-2005 03:34 PM
Can't get function caller if the caller is from a function within a popup window Mark Javascript 2 04-03-2004 07:57 AM
Retrieve class name of caller Koen Van Herck Python 2 09-22-2003 08:54 AM
Passing an Object Class from a method to a caller RLMuller Ruby 8 09-12-2003 03:48 PM



Advertisments