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

时间:2018-08-14 16:51:56

标签: printing rust tuples

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

在我无知的观点中,可以通过遍历整个元组来轻松实现打印-这将使显示不受大小限制。如果解决方案那么简单,那么我在这里想念什么?

2 个答案:

答案 0 :(得分:11)

当前使用macro that only works up to 12 elements实现打印元组。

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

关于为什么需要特殊支持的原因,请考虑以下元组:

year <- c("2000", "2000", "1999", "1999", "2000", "2000", "1998", "1998", "2000",
 "1998", "2000", "1998", "1999", "2000", "2000", "1999", "1999", "2000",  "1998", "1998", "1998", "2000", "1998", "1999", "1998", "2000", "1998",  "1999", "1999", "2000", "2000", "1999", "1999") 

sp <- c("Merluccius merluccius", "Gaidropsaurus vulgaris", "Gaidropsaurus macrophtalma",  "Merluccius merluccius", "Gaidropsaurus vulgaris", "Gaidropsaurus macrophtalma",  "Gaidropsaurus vulgaris", "Gaidropsaurus macrophtalma", "Gadiculus argenteus",  "Gadiculus argenteus", "Micromesistius poutassou", "Micromesistius poutassou",  "Gaidropsaurus vulgaris", "Gaidropsaurus macrophtalma", "Merluccius merluccius",   "Merluccius merluccius", "Gaidropsaurus vulgaris", "Gaidropsaurus macrophtalma",  "Gaidropsaurus vulgaris", "Gaidropsaurus macrophtalma", "Gadiculus argenteus",  "Gadiculus argenteus", "Micromesistius poutassou", "Micromesistius poutassou",  "Gaidropsaurus vulgaris", "Gaidropsaurus macrophtalma", "Gaidropsaurus vulgaris",  "Gaidropsaurus macrophtalma", "Micromesistius poutassou", "Gaidropsaurus vulgaris",  "Gaidropsaurus macrophtalma", "Gaidropsaurus vulgaris", "Gaidropsaurus macrophtalma")

depth <- c("77", "111", "456", "123", "389", "211", "244", "176", "198", "88", "118", "96", "117", "256", "193", "379", "201", "144", "193", "137", "188", "256", "193", "379", "201", "345", "100", "139", "222", "345", "675",  "67", "177")

dfrm <- data.frame (year, sp, depth)

鉴于元组的所有元素都具有不同的类型,您将如何对其进行迭代?这不能简单地使用常规迭代器和let mixed = (42, true, 3.14, "foo"); 循环来完成。您将需要一些新的类型级别语法,Rust目前尚缺乏这种语法。

答案 1 :(得分:2)

Debug仅在最多12个元素的元组上implemented。这就是为什么打印short可以但long失败的原因。