You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:15:41