遍历向量并将枚举转换为整数

Tob*_*ede 1 rust

我有一个枚举向量,我想将其转换为整数值,以便进行数值比较。

我不断遇到借用警告“无法脱离借用上下文”

我尝试了以下各种排列:

enum SomeEnum {
    A,
    B,
    C,
}

let values = vec![SomeEnum::A, SomeEnum::B];

for val in values.iter() {
  let i = *val as i32;
  // if i < X do something
}
Run Code Online (Sandbox Code Playgroud)

Opt*_*ach 5

呼叫时values.iter(),您将Vector作为切片引用,因为它implDeref<Target=[T]>。它返回Iteratorover &T,这是借来的。然后,您尝试以下行:

let i = *val as i32;
Run Code Online (Sandbox Code Playgroud)

这样做有一个问题:val类型是&SomeEnum,因此您不能将值移出引用或进行复制,因为SomeEnum它不是impl CopyClone。要解决此问题,您可以根据情况从以下选项中进行选择:

  • Copy通过使成为值enum Copy。这样做会导致rust隐式按位复制值。
#[derive(Copy)]
enum SomeEnum {
    A,
    B,
    C,
}
Run Code Online (Sandbox Code Playgroud)
  • Iterator::copied在迭代器上使用扩展名。这将复制每个值,以使迭代器产生T而不是&T。还要注意,当前这是一个每晚的api,因此您必须等待一段时间才能使其稳定。
#[derive(Copy)]
enum SomeEnum {
    A,
    B,
    C,
}
let values = vec![SomeEnum::A, SomeEnum::B];

for val in values.iter().copied() {
    let i = val as i32;
}
Run Code Online (Sandbox Code Playgroud)
  • 将其克隆。Clone是一种特性impl,在简单Copy按位运算不安全的情况下,它允许实现者复制数据,但也可以执行另一项操作。
#[derive(Clone)]
enum SomeEnum {
    A,
    B,
    C,
}
Run Code Online (Sandbox Code Playgroud)
  • 使用Iterator::cloned。再一次,这是与相似的想法Iterator::copied,只是它Clone是对象并且是稳定的。
#[derive(Clone)]
enum SomeEnum {
    A,
    B,
    C,
}
let values = vec![SomeEnum::A, SomeEnum::B];

for val in values.iter().cloned() {
    let i = val as i32;
}
Run Code Online (Sandbox Code Playgroud)
  • 消费Vec。这样一来,您就无法再使用Vec,而每个值都在中使用Vec。这是方法中最不灵活的一种,values由于将其移入,导致您无法访问into_iter(self)
enum SomeEnum {
    A,
    B,
    C,
}
let values = vec![SomeEnum::A, SomeEnum::B];

for val in values.into_iter() {
    let i = val as i32;
}
Run Code Online (Sandbox Code Playgroud)

还有其他几种方法可以解决此问题,但这是最简单的方法。

其他解决方法是:

  • 自定义impl数学运算
  • 实施From特质,使其在转换时更加明显。