我有一个枚举向量,我想将其转换为整数值,以便进行数值比较。
我不断遇到借用警告“无法脱离借用上下文”
我尝试了以下各种排列:
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)
呼叫时values.iter(),您将Vector作为切片引用,因为它impl是Deref<Target=[T]>。它返回Iteratorover &T,这是借来的。然后,您尝试以下行:
let i = *val as i32;
Run Code Online (Sandbox Code Playgroud)
这样做有一个问题:val类型是&SomeEnum,因此您不能将值移出引用或进行复制,因为SomeEnum它不是impl Copy或Clone。要解决此问题,您可以根据情况从以下选项中进行选择:
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特质,使其在转换时更加明显。| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |