Когда вы звоните values.iter()
, вы берете ссылку на Vec
tor как срез, потому что это impl
s Deref<Target=[T]>
. Возвращает Iterator
сверх &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
- это признак, который позволяет разработчику impl
копировать данные, а также выполнять другую операцию с ним, в случае, если просто Copy
битовое использование небезопасно.
#[derive(Clone)]
enum SomeEnum {
A,
B,
C,
}
- Используйте
Iterator::cloned
. Это, опять же, идея, аналогичная Iterator::copied
, за исключением того, что Clone
s объекты и стабильны
#[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;
}
Есть несколько других способов решения этой проблемы, но они самые простые.
Другие способы сделать это:
- Пользовательские
impl
математических операций
- Реализуйте черту
From
, чтобы сделать ее более очевидной при конвертации.