如何获得元组的长度?

Tom*_*Tom 5 tuples traits rust

这是我尝试过的行为:

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

这会产生错误:

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

std::iter::ExactSizeIterator看起来是一个不错的候选人,但我仍然不知道如何实施

语境

在尝试反向时Matrix,我意识到不要像这样干巴巴地列出矩阵的反向索引:

fn reverse(matrix: Matrix) -> Matrix {
    return Matrix(matrix.3, matrix.2, matrix.1, matrix.0)
}
Run Code Online (Sandbox Code Playgroud)

我也许可以按Matrix相反的顺序迭代。我看到如何迭代或映射元组?并认为这很复杂。如果能够获得元组的长度,就可以解决“如何迭代或映射元组?”这一问题。有一个更简单的解决方案。显然,我可以只使用“4”作为长度,但是如果我不使用结构体而是使用未知长度的元组怎么办?

log*_*yth 2

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

matrix.len();    // expected `4`
Run Code Online (Sandbox Code Playgroud)

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

impl Matrix {
    fn len(&self) -> usize {
        4
    }
}
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我认为你的reverse函数按原样就很好,因为平衡 DRY 和可读性很重要,并且区分代码重复和逻辑重复。

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

我还要补充一点,您可以reverse通过使用解构分配和自动返回来减少使用

fn reverse(matrix: Matrix) -> Matrix {
    let Matrix(a, b, c, d) = matrix;
    Matrix(d, c, b, a)
}
Run Code Online (Sandbox Code Playgroud)