假设:
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);
为什么会对我施加这样的限制?
答案 0 :(得分:3)
由于格式化系统的限制。
在内部,println!
(更确切地说,format_args!
)将其参数打包到数组中,将每个参数与其格式类型配对。例如,以下表达式:
println!("{2} {0:?} {1:x}", 1, 2, 3);
产生这个参数数组:
match (&1, &2, &3) {
(__arg0, __arg1, __arg2) => [
::std::fmt::argument(::std::fmt::Show::fmt, __arg0),
::std::fmt::argument(::std::fmt::LowerHex::fmt, __arg1),
::std::fmt::argument(::std::fmt::String::fmt, __arg2)
]
}
(顺便说一句,您可以使用rustc -Z unstable-options --pretty=expanded main.rs
)
这解释了为什么您的示例不起作用:如果您希望第一个参数(__arg0
) String
和Show
,那么你会把第二种类型放在哪里?
如果不使系统复杂化,就无法解除这个限制,所以很遗憾,我们只需要解决它。
答案 1 :(得分:-1)
不允许您重复使用相同的值:
fn main() {
println!("{0} {0}", 10);
}
工作正常。
问题出在错误信息中:
argument redeclared with type `?` when it was previously ``
你试图使用相同的参数作为两种不同的类型,这并不酷。我不是百分之百确定为什么不是,但事实并非如此。