有没有办法在不重复变量名的情况下将命名参数传递给格式宏?

Is there a way to pass named arguments to format macros without repeating the variable names?

使用新版本的 Rust,您可以像这样简化结构初始化:

Foo {
    a: a,
    b: b,
}

至此

Foo { a, b }

是否可以为类似 format!/println! 的宏做类似的事情?

现在我需要这样写:

let a = "a";
let b = "b";
write!(file, "{a} is {b}", a = a, b = b).unwrap();

是否可以用这样的 API 编写我自己的宏:

let a = "a";
let b = "b";
my_write!(file, "{a} is {b}", a, b).unwrap();

RFC 2795 has been accepted and implemented。从 Rust 1.58 开始,您将能够超越您想要的语法:

write!(file, "{a} is {b}").unwrap();

在那之前,您可以围绕 println! 和朋友们编写自己的包装器:

macro_rules! myprintln {
    ($fmt:expr, $($name:ident),*) => { println!($fmt, $($name = $name),*) }
}

fn main() {
    let a = "alpha";
    let b = "beta";
    myprintln!("{a} is {b}", a, b);
}

与完整的格式化程序宏相比,这可能总是受到限制,但对于您的情况来说可能已经足够了。

1.5 开始,这是您本机可以获得的最接近的值。

my_write!(file, "{} is {}", a, b).unwrap();

此外,正如 Shepmaster 指出的那样,我的答案最终会过时(发生这种情况时,我会尽量记住将其删除)。如果你想关注他们建议的(要实现的)语法,你可以检查 this github ticket 他们链接