Rust 为什么不允许在格式中使用相同的值!宏
鉴于: 我得到:Rust 为什么不允许在格式中使用相同的值!宏,rust,Rust,鉴于: 我得到: fn main() { println!("{0} {0:?}", 10); } 我被迫做: main.rs:2:27: 2:29 error: argument redeclared with type `?` when it was previously `` main.rs:2 println!("{0} {1:?}", 10); ^~ error: aborting due to
fn main() {
println!("{0} {0:?}", 10);
}
我被迫做:
main.rs:2:27: 2:29 error: argument redeclared with type `?` when it was previously ``
main.rs:2 println!("{0} {1:?}", 10);
^~
error: aborting due to previous error
为什么要对我施加这样的限制?这并不是禁止您使用相同的值:
println!("{0} {1:?}", 10, 10);
// OR
println!("{} {:?}", 10, 10);
很好用
问题在于错误消息所说的内容:
fn main() {
println!("{0} {0}", 10);
}
你试图用同一个论点作为两种不同的论点,这并不酷。我不能100%确定为什么不是,但它不是。这是由于格式化系统的限制 内部,
println代码>(更准确地说,是)将其参数打包到一个数组中,将每个参数与其格式类型配对。例如,以下表达式:
argument redeclared with type `?` when it was previously ``
生成此参数数组:
println!("{2} {0:?} {1:x}", 1, 2, 3);
(顺便说一下,您可以使用rustc-Z不稳定选项--pretty=expanded main.rs
)看到完整的扩展)
这解释了您的示例不起作用的原因:如果您希望第一个参数(\uu arg0
)同时是Debug
和Display
,那么第二种类型将放在哪里
如果不使系统变得太复杂,就无法取消此限制,因此很遗憾,我们必须解决它。可能是因为println
是宏,并且在编译时对其进行评估。因此,如果某个值应该与两种不同的类型一起使用,那么很自然会出现错误。@steve我可以执行“{0}{0:#X}”。格式(10)
Python@steve我应该说我知道你的行为是合法的,对不起。
match (&1, &2, &3) {
(__arg0, __arg1, __arg2) => [
::std::fmt::argument(::std::fmt::Debug::fmt, __arg0),
::std::fmt::argument(::std::fmt::LowerHex::fmt, __arg1),
::std::fmt::argument(::std::fmt::Display::fmt, __arg2)
]
}