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

mag*_*gu_ 7 printing tuples rust

我刚刚在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`
}
Run Code Online (Sandbox Code Playgroud)

在我无知的观点中,通过迭代整个元组可以很容易地实现打印 - 这将允许在没有大小限制的情况下进行显示.如果解决方案很简单就会实现,我在这里缺少什么?

mca*_*ton 13

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

已经提出了静态迭代/操纵元组的功能,但是已被推迟(参见例如此RFC).关于这些的实现存在一些担忧(例如,您希望能够获得元组的头部和尾部,但实际上并不能保证元组将按照您指定的顺序存储,因为允许编译器优化空间,这意味着获得尾部不会是一个简单的操作).

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

let mixed = (42, true, 3.14, "foo");
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,这些实现的缺点和担忧可能太重要了,几乎没有什么好处(大元组非常罕见,使用宏可以很容易地处理小元组).请注意,大数组确实遇到同样的问题并且更常见,但正如@Tim所提到的,const泛型应该修复它们的情况. (2认同)