Como lançar entre tipos [duplicado]
Sep 15 2020
Estava tentando escrever uma função genérica que preenche o vetor no intervalo
fn fill_vec<T: From<usize> + Copy>(target: &mut Vec<T>, to: usize, step: usize) {
let mut start = 0_usize;
for i in 0..to {
if start >= to {
break;
} else {
if start > 0 {
target.push(T::from(start));
}
start += step;
}
};
}
Mas eu entendi o erro
error[E0277]: the trait bound `i32: std::convert::From<usize>` is not satisfied
--> src/main.rs:28:14
fill_vec(&mut target, 30, 4);
| ^^^^^^^^^^^ the trait `std::convert::From<usize>` is not implemented for `i32`
Respostas
prog-fh Sep 15 2020 at 03:04
Na verdade, você não pode converter implicitamente de usizepara i32. Para este tipo de elenco (que pode levar ao truncamento), você precisa da aspalavra - chave.
fn main() {
let mut v: Vec<i32> = Vec::new();
let a: usize = 123;
// v.push(a);
// expected `i32`, found `usize`
// v.push(i32::from(a));
// the trait `std::convert::From<usize>` is not implemented for `i32`
v.push(a as i32); // cast
}
Sobre o seu exemplo específico, a num_traitscaixa pode ajudar.
fn fill_vec<T: num_traits::cast::FromPrimitive>(
target: &mut Vec<T>,
to: usize,
step: usize,
) {
let mut start = 0_usize;
for i in 0..to {
if start >= to {
break;
} else {
if start > 0 {
target.push(T::from_usize(start).unwrap());
}
start += step;
}
}
}
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?