我刚刚开始学习 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 个元素。
静态迭代/操作元组的功能已经被提出,但已被推迟(例如参见this RFC)。对于这些的实现存在一些担忧(例如,您希望能够获取元组的头和尾部,但实际上不能保证元组将以与您指定的顺序相同的顺序存储,因为编译器可以优化空间,这意味着获取尾部并不是一个简单的操作)。
至于为什么您需要特殊支持,请考虑以下元组:
let mixed = (42, true, 3.14, "foo");
考虑到该元组的所有元素都具有不同的类型,您将如何迭代该元组?这不能简单地使用常规迭代器和 for
循环来完成。您需要一些新的类型级语法,而 Rust 目前缺乏这种语法。