为什么元组格式在 Rust 中限制为 12 个项目?



我刚刚在 Rust 中开始了一个教程,我无法理解元组打印的限制:

fn main() {
// Tuple definition
let short = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
let long = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
println!("{:?}", short); // Works fine
println!("{:?}", long);  // ({integer}...{integer})` cannot be formatted using `:?` because it doesn't implement `std::fmt::Debug`
}

在我无知的观点中,可以通过迭代整个元组轻松实现打印 - 这将允许在没有大小限制的情况下显示。如果解决方案如此简单,它将实施,我在这里错过了什么?

打印元组目前使用最多只能处理 12 个元素的宏来实现。

已经提出了静态迭代/操作元组的功能,但已被推迟(例如,请参阅此 RFC(。对这些的实现有一些担忧(例如,您希望能够获得元组的头部和尾部,但实际上不能保证元组将以与您指定的顺序相同的顺序存储,因为编译器被允许优化空间,这意味着获取尾部不会是一个微不足道的操作(。

至于为什么你需要特殊支持,请考虑以下元组:

let mixed = (42, true, 3.14, "foo");

鉴于其所有元素都有不同的类型,您将如何迭代此元组?这不能简单地使用常规迭代器和for循环来完成。你需要一些新的类型级语法,而 Rust 目前缺乏这些语法。

Debug仅在最多 12 个元素的元组上实现。这就是为什么打印short有效,但long失败的原因。

最新更新