¿Hay alguna manera en Ruby para encontrar el nombre del método de llamada dentro de un método?
Por ejemplo:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
¿Hay alguna manera en Ruby para encontrar el nombre del método de llamada dentro de un método?
Por ejemplo:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Respuestas:
puts caller[0]
o quizás...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Supongo que esto es solo para Ruby.
En Ruby 2.0.0, puedes usar:
caller_locations(1,1)[0].label
Es mucho más rápido que la solución Ruby 1.8+:
caller[0][/`([^']*)'/, 1]
Se incluirá backports
cuando tenga el tiempo (o una solicitud de extracción).
caller_locations[0].label
en Ruby 2.2.0, de lo contrario, siempre tendrá send_action
resultados
Uso caller_locations(1,1)[0].label
(para ruby> = 2.0)
Editar : mi respuesta decía usar __method__
pero estaba equivocado, devuelve el nombre del método actual.
yo suelo
caller[0][/`([^']*)'/, 1]
'
más allá de la que está buscando (y supongo que no puede), el resultado será el mismo, claro. Sin embargo, [^']*
funcionará mejor ya que el motor de expresiones regulares dejará de intentar igualar esa parte con la expresión en el momento en que llegue a '
(su versión irá al final, luego retrocederá porque no encontró un '
al final). La diferencia es bastante insignificante en este caso, por supuesto, pero es un buen hábito evitar .
en expresiones regulares siempre que sea posible.
En su lugar, puede escribirlo como función de biblioteca y hacer una llamada donde sea necesario. El código es el siguiente:
module CallChain
def self.caller_method(depth=1)
parse_caller(caller(depth+1).first).last
end
private
# Copied from ActionMailer
def self.parse_caller(at)
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
file = Regexp.last_match[1]
line = Regexp.last_match[2].to_i
method = Regexp.last_match[3]
[file, line, method]
end
end
end
Para activar el método del módulo anterior, debe llamar así:
caller = CallChain.caller_method
Para ver la información de la persona que llama y de la persona que llama en cualquier idioma, ya sea ruby, java o python, siempre querrá ver el seguimiento de la pila. En algunos lenguajes, como Rust y C ++, hay opciones integradas en el compilador para activar algún tipo de mecanismo de creación de perfiles que puede ver durante el tiempo de ejecución. Creo que existe uno para Ruby llamado ruby-prof.
Y como se mencionó anteriormente, puede buscar rubí en la pila de ejecución. Esta pila de ejecución es una matriz que contiene objetos de ubicación de rastreo.
Esencialmente, todo lo que necesita saber sobre este comando es el siguiente:
llamador (inicio = 1, longitud = nulo) → matriz o nulo