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”作为长度,但是如果我不使用结构体而是使用未知长度的元组怎么办?
有几种方法可以解决这个问题。我会尽力扩展。
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)