Эквивалент __func__ или __FUNCTION__ в Rust?
В C и С++ вы можете получить имя текущей исполняемой функции с помощью макроса __func__
с C99 и С++ 11 и ___FUNCTION___
для MSVC.
Есть ли эквивалент этого в Rust?
Пример __func__
в C:
#include "stdio.h"
void funny_hello() {
printf ("Hello from %s\n", __func__);
}
int main() {
funny_hello();
}
Выходы Hello from funny_hello
.
Ответы
Ответ 1
Об этом был RFC, но он никогда не был согласован или не реализован.
Обоснование его отсутствия:
"В общем, я не думаю, что кто-либо из нас дал чрезмерную сумму подумал об этих макросах с" отладкой "в терминах долгосрочных стабильность. Большинство из них кажутся довольно безобидными, но обеспечить всех из них для всех программ Rust навсегда - это сильный обязательство сделать. Мы можем кратко рассмотреть историю этих макросов в сочетании с рассмотрением добавления этого нового макроса."
Возможно, у Руста будет что-то сопоставимое в будущем,
но сейчас вам нужно будет полагаться на свои собственные теги.
Примечание: __FUNCTION__
является нестандартным, __func__
существует в C99/С++ 11.
Ответ 2
Вы можете взломать один вместе с std::any::type_name
.
macro_rules! function {
() => {{
fn f() {}
fn type_name_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
let name = type_name_of(f);
&name[..name.len() - 3]
}}
}
Обратите внимание, что это дает полный путь, поэтому my::path::my_func
вместо просто my_func
. Доступна демоверсия.