【问题标题】:How can I get the length of a tuple?如何获得元组的长度?
【发布时间】:2017-08-20 04:59:09
【问题描述】:

这是我尝试过的行为:

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' 作为长度,但如果我不使用结构,而是使用未知长度的元组会怎样。

【问题讨论】:

  • 就其本身而言,这似乎可能是XY problem,或者是一种误解。是什么让您期望已经有一种方法可以解决这个问题?您已经定义了自己的新数据类型Matrix,因此您可以定义一个方法来获取长度,但给定您的示例,无论如何它只会返回一个常量。目前这个问题只是“我如何定义一个方法”。
  • 好点。我在问一个 XY 问题。但是,为了自己解决问题,我提出了一个关于语言的基本问题。您链接到的问题的最佳答案建议发布上下文作为 XY 问题的解决方案,因此请参阅问题的编辑
  • @loganfsmyth 我已经编辑了我的问题

标签: rust tuples traits


【解决方案1】:

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

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)
}

【讨论】:

  • 非常感谢您的回答!你认为 Vector 是实现动态长度矩阵的更好数据结构吗?
  • 如果它有未知数量的项目,Vec 是有道理的,但你的例子似乎并不意味着这一点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2018-01-12
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多