我怎样才能得到一个元组的长度?
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 有不同的类型,它的长度是多少?
这是我尝试过的行为:
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
。我看到
有几种方法可以解决这个问题。我会尽力扩展。
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 有不同的类型,它的长度是多少?