Rust是否有类似C#中CallerMemberName的特性?
在Rust中获取调用方函数名称(类似C#的
CallerMemberName) Rust标准库没有提供和C# CallerMemberName完全一致的特性,但可以通过两种简单方式实现相同效果:
方法一:利用std::panic::Location获取调用方
通过std::panic::Location::caller()可以拿到调用当前函数的代码位置,从中提取函数名称。示例代码:
fn get_caller_name() -> &'static str { // 跳过当前函数,获取上一层调用者的函数名 std::panic::Location::caller().function_name().unwrap_or("unknown") } fn foo() { println!("调用我的函数是:{}", get_caller_name()); } fn main() { foo(); // 输出:调用我的函数是:foo }
注:如果函数被多层嵌套调用或在宏展开中调用,可能需要调整逻辑跳过更多层级,但常规场景下这个写法足够使用。
方法二:用宏实现更精准的控制
宏在编译期展开,能直接获取调用宏的位置,避免了函数调用带来的层级偏移,结果更准确:
macro_rules! caller_name { () => {{ std::panic::Location::caller().function_name().unwrap_or("unknown") }}; } fn bar() { println!("调用我的函数是:{}", caller_name!()); } fn main() { bar(); // 输出:调用我的函数是:bar }
额外处理:提取纯函数名
function_name()返回的内容可能包含完整模块路径(比如crate::my_module::foo),如果只需要纯函数名,可以做字符串分割处理:
fn get_short_caller_name() -> &'static str { std::panic::Location::caller() .function_name() .unwrap_or("unknown") .split("::") .last() .unwrap_or("unknown") }
以上两种方式都是编译期处理,几乎没有运行时开销,完全可以替代CallerMemberName的功能。
内容的提问来源于stack exchange,提问作者Michael Kruglos
相关产品推荐
相关产品推荐

