首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遍历向量并将枚举转换为整数

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

Stack Overflow用户
提问于 2019-05-28 00:26:20
回答 2查看 440关注 0票数 1

我有一个枚举向量,我想要转换成一个整数值,这样我就可以进行数值比较。

我经常碰到借来的警告:“不能脱离借来的环境”。

我尝试过以下各种排列方式:

代码语言:javascript
运行
复制
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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-28 02:14:04

调用values.iter()时,可以将对Vector的引用作为切片,因为它是Deref。它返回一个借用的Iterator an &T。然后,您可以尝试下面的一行:

代码语言:javascript
运行
复制
let i = *val as i32;

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

  • Copy值,通过创建enum Copy。让它这样做,结果是允许锈病隐式复制值,按位。
代码语言:javascript
运行
复制
#[derive(Copy)]
enum SomeEnum {
    A,
    B,
    C,
}
  • 在迭代器上使用Iterator::copied扩展。这会复制每个值,从而使迭代器生成T而不是&T。请注意,目前这是一个夜间api,因此您需要等待更长的时间才能使它变得稳定。
代码语言:javascript
运行
复制
#[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;
}
  • 让它克隆。Clone是一种特性,它允许实现者复制数据,但也可以使用它执行另一项操作,在按位进行Copy是不安全的情况下。
代码语言:javascript
运行
复制
#[derive(Clone)]
enum SomeEnum {
    A,
    B,
    C,
}
  • 使用Iterator::cloned。这也是一个类似于Iterator::copied的想法,除了Clone的对象是稳定的。
代码语言:javascript
运行
复制
#[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;
}
  • 消耗Vec。这使得您不能再使用Vec,而是在Vec中使用每个值。这是最不灵活的方法,导致您失去对values的访问,因为它被移动到into_iter(self)中。
代码语言:javascript
运行
复制
enum SomeEnum {
    A,
    B,
    C,
}
let values = vec![SomeEnum::A, SomeEnum::B];

for val in values.into_iter() {
    let i = val as i32;
}

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

实现这一目标的其他方式有:

  • 数学运算的自定义impl
  • 实现一个From特性,以使您的转换更加明显。
票数 5
EN

Stack Overflow用户

发布于 2019-05-28 02:39:36

iter使用对元素的引用遍历集合。into_iter会导致移动,它将允许您访问实际的元素。如果您对移动没有意见,那么这可以帮助简化枚举序数值的转换:

代码语言:javascript
运行
复制
for val in values.into_iter() {
    let i = val as i32;
    // if i < X do something
}

或者,如果您希望能够再次迭代向量,则可以使用克隆:

代码语言:javascript
运行
复制
#[derive(Clone)]
enum SomeEnum {
    A,
    B,
    C,
}

它允许在分配枚举值的新实例后进行强制转换:

代码语言:javascript
运行
复制
let values = vec![SomeEnum::A, SomeEnum::B];
for val in values.iter() {
    let i = (val.clone()) as i32;
    // if i < X do something
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56333721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档