Forum: Ruby Getting the current module(s), class name and method in Ruby 1.9

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Iñaki Baz C. (Guest)
on 2009-03-31 01:34
(Received via mailing list)
Hi, first of all I'm sorry since I already did this question some time
ago
(but I ca't find it now).

Basically I want the following:

---------------
module MyModule

  class MyClass
    def show_log
      puts "I'm here: ###### FIXME ######"
    end
  end

end


my_class = MyModule::MyClass.new
my_class.show_log
=> I'm here: MyModule::MyClass#show_log
---------------

When I did this question I remember that it was not possible with Ruby
1.8 but
it was feasible in Ruby 1.9.

Could you please show me how to get it?
Thanks a lot.
Michael M. (Guest)
on 2009-03-31 01:37
(Received via mailing list)
Iñaki Baz C. wrote:
>       puts "I'm here: ###### FIXME ######"
>
> When I did this question I remember that it was not possible with Ruby 1.8 but
> it was feasible in Ruby 1.9.
>
> Could you please show me how to get it?
> Thanks a lot.
>
>
>
>
Something I prefer to use is the __LINE__ and __FILE__ constants.  They
work a treat!

=======================================================================
This email, including any attachments, is only for the intended
addressee.  It is subject to copyright, is confidential and may be
the subject of legal or other privilege, none of which is waived or
lost by reason of this transmission.
If the receiver is not the intended addressee, please accept our
apologies, notify us by return, delete all copies and perform no
other act on the email.
Unfortunately, we cannot warrant that the email has not been
 altered or corrupted during transmission.
=======================================================================
Iñaki Baz C. (Guest)
on 2009-03-31 01:56
(Received via mailing list)
El Lunes 30 Marzo 2009, Michael M. escribió:
> Something I prefer to use is the __LINE__ and __FILE__ constants.  They
> work a treat!

That's ok, but it's not what I'm looking for.
Basically I want a logger that shows the current module(s), class name
and
method name.

Thanks.
Sean O. (Guest)
on 2009-03-31 02:08
(Received via mailing list)
On Mon, Mar 30, 2009 at 10:32 PM, Iñaki Baz C. 
<removed_email_address@domain.invalid> wrote:
>      puts "I'm here: ###### FIXME ######"
>
> When I did this question I remember that it was not possible with Ruby 1.8 but
> it was feasible in Ruby 1.9.
>
> Could you please show me how to get it?
> Thanks a lot.

Hi,

The following works in both 1.8.6 and 1.9.1 (calling_method is by
Robert K. - see ruby-talk 205150 & 205950).

module Kernel
  private
  def calling_method(level = 1)
    caller[level] =~ /`([^']*)'/ and $1
  end

  def this_method
    calling_method
  end
end

module MyModule
  class MyClass
    def show_log
      puts "#{self.class}.#{this_method}"
    end
  end
end

MyModule::MyClass.new.show_log # => MyModule::MyClass.show_log

Regards,
Sean
Iñaki Baz C. (Guest)
on 2009-03-31 02:27
(Received via mailing list)
El Martes 31 Marzo 2009, Sean O'Halpin
escribió:> >    def show_log
> > ---------------
> Robert K. - see ruby-talk 205150 & 205950).
> end
>
> module MyModule
>   class MyClass
>     def show_log
>       puts "#{self.class}.#{this_method}"
>     end
>   end
> end
>
> MyModule::MyClass.new.show_log # => MyModule::MyClass.show_log


Fantastic! Thanks a lot.
Iñaki Baz C. (Guest)
on 2009-03-31 03:18
(Received via mailing list)
El Martes 31 Marzo 2009, Iñaki Baz C.
escribió:
> Fantastic! Thanks a lot.

If somebody is interested, I've implemented the above code adding Class
methods logging feature:

----------------
module Kernel

  def this_method
    if self.class == Class
      "#{self.to_s}.#{caller[0][/`(.*)'/, 1]}"
    else
      "#{self.class}##{caller[0][/`(.*)'/, 1]}"
    end
  end
  private :this_method

end



module MM
  class AA
    def self.class_method
      puts this_method
    end

    def instance_method
      puts this_method
    end
  end
end


MM::AA.class_method
=> "MM::AA.class_method"

MM::AA.new.instance_method
=> "MM::AA#instance_method"
----------------


Regards.
Iñaki Baz C. (Guest)
on 2009-03-31 23:56
(Received via mailing list)
El Martes 31 Marzo 2009, Iñaki Baz C.
escribió:>       "#{self.to_s}.#{caller[0][/`(.*)'/, 1]}"
> module MM
>
>
> MM::AA.class_method
> => "MM::AA.class_method"
>
> MM::AA.new.instance_method
> => "MM::AA#instance_method"
> ----------------


Hi again. Wouldn't make sense to have such features in Ruby core instead
of
having to parse "caller[0][/`(.*)'/, 1]" and so?

Is it possible to open a feature request for it? or is it too late for
such
wishes in 1.9?

Thanks.
This topic is locked and can not be replied to.