我有一个枚举向量,我想要转换成一个整数值,这样我就可以进行数值比较。
我经常碰到借来的警告:“不能脱离借来的环境”。
我尝试过以下各种排列方式:
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
}发布于 2019-05-28 02:14:04
调用values.iter()时,可以将对Vector的引用作为切片,因为它是Deref。它返回一个借用的Iterator an &T。然后,您可以尝试下面的一行:
let i = *val as i32;这有一个问题:val是&SomeEnum类型的,因此您不能将值移出引用或复制它,因为SomeEnum不会强制Copy或Clone。要解决此问题,您可以根据场景从以下选项中进行选择:
Copy值,通过创建enum Copy。让它这样做,结果是允许锈病隐式复制值,按位。#[derive(Copy)]
enum SomeEnum {
A,
B,
C,
}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;
}Clone是一种特性,它允许实现者复制数据,但也可以使用它执行另一项操作,在按位进行Copy是不安全的情况下。#[derive(Clone)]
enum SomeEnum {
A,
B,
C,
}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;
}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;
}解决这一问题还有其他几种方法,但这是最简单的方法。
实现这一目标的其他方式有:
implFrom特性,以使您的转换更加明显。发布于 2019-05-28 02:39:36
iter使用对元素的引用遍历集合。into_iter会导致移动,它将允许您访问实际的元素。如果您对移动没有意见,那么这可以帮助简化枚举序数值的转换:
for val in values.into_iter() {
let i = val as i32;
// if i < X do something
}或者,如果您希望能够再次迭代向量,则可以使用克隆:
#[derive(Clone)]
enum SomeEnum {
A,
B,
C,
}它允许在分配枚举值的新实例后进行强制转换:
let values = vec![SomeEnum::A, SomeEnum::B];
for val in values.iter() {
let i = (val.clone()) as i32;
// if i < X do something
}https://stackoverflow.com/questions/56333721
复制相似问题