Это упрощенный пример моего перечисления:
#[derive(Debug, Clone, Copy)]
enum Data<'a> {
I32(&'a [i32]),
F64(&'a [f64]),
}
Я использую enum
для хранения различных типов срезов (не только &[i32]
и &[f64]
, как в примере выше, но и многих других).больше) к тому же вектору Vec<Data<'a>>
.Мне нужен способ перебирать значения срезов (либо &[i32]
, либо &[f64]
, независимо от того, что хранится в enum
), преобразуя все значения в String
.Следующий код показывает, чего в принципе я хотел бы достичь, но это не работает:
impl<'a> Data<'a> {
fn iter_to_string(&self) -> impl Iterator<Item = String> {
match self {
Data::I32(data) => data.iter().map(|&x| x.to_string()),
Data::F64(data) => data.iter().map(|&x| x.to_string()),
}
}
}
error[E0308]: match arms have incompatible types
--> src/main.rs:9:9
|
9 | / match self {
10 | | Data::I32(data) => data.iter().map(|&x| x.to_string()),
11 | | Data::F64(data) => data.iter().map(|&x| x.to_string()),
| | ----------------------------------- match arm with an incompatible type
12 | | }
| |_________^ expected i32, found f64
|
= note: expected type `std::iter::Map<std::slice::Iter<'_, i32>, [closure@src/main.rs:10:48: 10:66]>`
found type `std::iter::Map<std::slice::Iter<'_, f64>, [closure@src/main.rs:11:48: 11:66]>`