有没有办法在不重复变量名的情况下将命名参数传递给格式宏?
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 他们链接
使用新版本的 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 他们链接