如何获得元组的长度?

时间:2017-08-20 04:59:10

标签: rust tuples traits

这是我尝试过的行为:

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`

产生错误:

Matrix

std::iter::ExactSizeIterator看起来很合适,但我仍然不知道如何实施

上下文

在试图反转fn reverse(matrix: Matrix) -> Matrix { return Matrix(matrix.3, matrix.2, matrix.1, matrix.0) } 时,我意识到代替dryly列出了矩阵的反向索引,如下所示:

Matrix

我可能会以相反的顺序迭代Output of uname -r: root@vkalyanam-Lenovo-B41-80:~/realtek# uname -r 4.11.0 Realtek ethernet Sources: root@vkalyanam-Lenovo-B41-80:~/realtek# ls cscope.out icmp icmp2_recev logs_kernel Makefile out realtek.c tags Upon make, realtek.ko module has created, but i was not able to load it. 。我看到How to iterate or map over tuples?并认为它很复杂。如果一个人能够获得元组的长度,就可以解决问题"如何迭代或映射元组?"用更简单的解决方案。显然,我可以使用' 4'作为长度,但如果我没有使用结构而是使用未知长度的元组,那该怎么办呢。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

就我个人而言,我认为你的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)
}

答案 1 :(得分:0)

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