变量前的问号运算符 (?) - 它们在 Rust 中起什么作用?

Shl*_*sid 7 rust

我最近正在提高我生疏的技能,并看到(在一些副驾驶建议中)问号运算符用作变量的前缀:

debug!(?raw); // raw is of type String

// Also

match self.subnet_tx.send((raw, addr)) {
    Ok(_size) =>  continue,
    Err(err: SendError<(String, SocketAddr)>) => {
        error!(cause = ?err, "error sending to channel");
        continue;
    }
};
Run Code Online (Sandbox Code Playgroud)

显然我用谷歌搜索并阅读了有关?运算符 - 然而,我找不到任何有用的信息。

我找到的最接近的信息与该?Sized特征有关。

谁能解释一下它的用途是什么?应该使用吗?在哪些情况下?

谢谢。

Ale*_*uze 12

Rust 中没有“变量前的问号”。但是,它可以用作宏中的标记,并且看到您的代码仅在宏中使用它,我相信这里就是这种情况。如果您能提供宏的来源debugerror来源,则可以确认。

编辑。这些宏来自跟踪箱。正如文档所说:

这 ?sigil 是指定应使用其 fmt::Debug 实现记录的字段的简写

所以这不是一些通用约定,而是跟踪箱设计者选择的一些特定语法。