7

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

Foo {
    a: a,
    b: b,
}

对此

Foo { a, b }

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

现在我需要这样写:

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();
4

2 回答 2

10

RFC 2795已被接受并实施。从 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);
}

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

于 2017-07-27T17:25:32.650 回答
-1

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

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

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

于 2018-08-24T02:59:04.133 回答