No es un duplicado de "Obtener el nombre del método ejecutado actualmente en Ruby". Esta pregunta solicita el nombre del método de llamada, no el nombre del método actual.
¿Cuál es la ventaja de esto sobre el enfoque de DigitalRoss?
Andrew Grimm
2
Más limpio y más preciso. En lugar de hacer la búsqueda, utilice un método de matriz para dividir los caracteres no deseados en función de la posición (lo que podría ser incorrecto).
Nueva Alejandría
2
¿Por qué no usar simplemente la persona que llama [0] [/ `(. *) '/, 1]? No soy un gurú de las expresiones regulares, pero parece funcionar.
collimarco
77
@collimarco Mientras la Cadena no contenga '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:
moduleCallChaindefself.caller_method(depth=1)
parse_caller(caller(depth+1).first).last
end
private
# Copied from ActionMailerdefself.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
Siempre es bienvenido un enlace a una solución potencial, pero agregue contexto alrededor del enlace para que sus usuarios tengan una idea de qué es y por qué está allí. Siempre cite la parte más relevante de un enlace importante, en caso de que no se pueda acceder al sitio de destino o se desconecte permanentemente. Tenga en cuenta que ser apenas más que un enlace a un sitio externo es una posible razón de por qué y cómo se eliminan algunas respuestas. .
Xavi López
@ XaviLópez han actualizado la respuesta, PLZ rectificar si estoy haciendo mal o Somthing equivocada ... thnx para la sugerencia buena :)
Amit karsale
1
Gracias por mejorar tu respuesta. Desafortunadamente, no tengo suficiente conocimiento sobre Ruby para poder comentar adecuadamente sobre esta publicación, pero la respuesta parece correcta ahora. He eliminado mi voto negativo. Mejor suerte :-)
Xavi López
2
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
Respuestas:
o quizás...
fuente
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Supongo que esto es solo para Ruby.En Ruby 2.0.0, puedes usar:
Es mucho más rápido que la solución Ruby 1.8+:
Se incluirá
backports
cuando tenga el tiempo (o una solicitud de extracción).fuente
caller_locations[0].label
en Ruby 2.2.0, de lo contrario, siempre tendrásend_action
resultadosUso
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.fuente
yo suelo
fuente
'
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.Qué tal si
Mucho más limpio imo.
fuente
En su lugar, puede escribirlo como función de biblioteca y hacer una llamada donde sea necesario. El código es el siguiente:
Para activar el método del módulo anterior, debe llamar así:
caller = CallChain.caller_method
código de referencia de
fuente
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
fuente