为什么不允许在格式中重复使用相同的值!宏

时间:2015-01-13 19:02:12

标签: 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 previous error

我被迫做:

println!("{0} {1:?}", 10, 10);
// OR
println!("{} {:?}", 10, 10);

为什么会对我施加这样的限制?

2 个答案:

答案 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 StringShow,那么你会把第二种类型放在哪里?

如果不使系统复杂化,就无法解除这个限制,所以很遗憾,我们只需要解决它。

答案 1 :(得分:-1)

不允许您重复使用相同的值:

fn main() {
    println!("{0} {0}", 10);
}

工作正常。

问题出在错误信息中:

argument redeclared with type `?` when it was previously ``

你试图使用相同的参数作为两种不同的类型,这并不酷。我不是百分之百确定为什么不是,但事实并非如此。