我刚开始做tutorial in 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`
}

在我看来,通过对整个元组进行迭代,可以很容易地实现打印——这将允许在不受大小限制的情况下进行显示.如果解决方案是那么简单,那么它就会被实现,我在这里缺少什么?

推荐答案

打印元组目前使用macro that only works up to 12 elements.

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

至于为什么需要对此进行特殊支持,请考虑下面的元组:

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

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

Rust相关问答推荐

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

MPSC频道在接收器处阻塞

如何将像烫手山芋一样不透明的值从一个Enum构造函数移动到下一个构造函数?

字段类型为Boxed的 struct 的生存期必须超过static

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

Rust 的多态现象.AsRef与Derf

更合理的方法来设计样条线函数器?

如何初始化选项<;T>;数组Rust 了?

Rust:为什么 &str 不使用 Into

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

Rust 如何将链表推到前面?

Rust 编译器不统一在 if let 表达式的分支中都 impl Future 的类型

Some(v) 和 Some(&v) 有什么区别?

在 Rust 中,Weak 如何知道内部值何时被删除?

为什么 i32 Box 类型可以在 Rust 中向下转换?

隐式类型闭包的错误生命周期推断

如何从 many0 传播 Nom 失败上下文?

如何在 Rust 的内置函数上实现特征?

为什么这里需要类型注解?