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)
        ]
}