
Submitted by fryedpeach (Tue Oct 17 11:25:15 UTC 2006)
Currently, Kernel#caller returns Array of Strings.
That means, when you want just a name of the method, you need parsing:
def parse_caller(caller_output)
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ caller_output
{:file => $1, :line => $2.to_i, :method => $3}
end
end
parse_caller(caller.first)[:method]
That's sometimes a pain.
class CallerInfo < Struct.new(:file, :line, :method)
def to_s
"#{file}:#{line}:in `#{method}'"
end
end
The code above could be simpler:
caller.first.method
module Kernel
CallerInfo = Struct.new(:file, :line, :method)
class CallerInfo
def to_s
"#{file}:#{line}:in `#{method}'"
end
end
alias unstructured_caller caller
def caller(level=1)
if level < 0
raise ArgumentError, "negative level (#{level})"
end
unstructured_caller(level+1).collect do |item|
/^(.+?):(\d+)(?::in `(.*)')?/.match(item)
CallerInfo.new($1, $2.to_i, $3)
end
end
module_function :caller
end
CallerInfo#to_s is imcomplete.

| Comments | Current voting | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|


RCRchive copyright © David Alan Black, 2003-2005.
Powered by .
In whatever form it takes I strongely favor it too.
T.
Adding new method (like Kernel#structured_caller ?) may be more acceptable than my proposal. I like either.
fryedpeach