Эквивалент __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. Доступна демоверсия.