我怎样才能得到一个元组的长度?

How can I get the length of a tuple?

这是我尝试过的行为:

struct Matrix(f32, f32, f32, f32);
let matrix = Matrix(1.1, 1.2, 2.1, 2.2);
matrix.len();    // expected `4`

产生错误:

error[E0599]: no method named `len` found for type `&tuples::Matrix` in the current scope
  --> src/tuples.rs:19:44
   |
19 |         println!("matrix length: {}", self.len());
   |                                            ^^^
   |
   = help: items from traits can only be used if the trait is implemented and in scope
   = note: the following traits define an item `len`, perhaps you need to implement one of them:
           candidate #1: `std::iter::ExactSizeIterator`
           candidate #2: `core::slice::SliceExt`
           candidate #3: `core::str::StrExt`

std::iter::ExactSizeIterator 看起来不错,但我还是不知道怎么实现

上下文

在尝试反转 Matrix 时,我意识到不是 dryly 像这样列出矩阵的反转索引:

fn reverse(matrix: Matrix) -> Matrix {
    return Matrix(matrix.3, matrix.2, matrix.1, matrix.0)
}

我也许可以以相反的顺序遍历 Matrix。我看到 并认为它很复杂。如果能够得到元组的长度,就可以用一种更简单的解决方案来解决 "How to iterate or map over tuples?" 这个问题。显然,我可以只使用“4”作为长度,但是如果我不使用结构而是使用未知长度的元组怎么办。

有几种方法可以解决这个问题。我会尽力扩展。

matrix.len();    // expected `4`

您已经定义了自己的 Matrix 数据类型。没有额外的逻辑,完全由您来定义,例如

impl Matrix {
    fn len(&self) -> usize {
        4
    }
}

我个人认为您的 reverse 函数就这样很好,因为平衡 DRY 与可读性以及区分代码重复与逻辑重复很重要。

这里的另一点是,单独拥有长度并不能提供太多信息。 matrix.0 是 Rust 中的显式语法,但没有办法实际使用长度来做任何事情。 matrix[i] 不是您对数据类型实施的操作。您 可以 可能实现该类型或 Iterator ,但这似乎不是您在这里真正想要的。迭代器是一致项的流,但您的矩阵项具有基于其索引的明确含义,这在迭代器的上下文中会失去其含义。

我还要补充一点,您可以使用解构赋值和自动 return,通过

trim 降低您的 reverse
fn reverse(matrix: Matrix) -> Matrix {
    let Matrix(a, b, c, d) = matrix;
    Matrix(d, c, b, a)
}

在 Rust 中你不能迭代或请求元组长度。 元组的实现方式类似于结构(如果您愿意,可以使用匿名结构)。 考虑到 tuple/struct 有不同的类型,它的长度是多少?