Если ты хочешь изменять внешний массив, то его надо принимать по `&mut` ссылке. `mut input:Vec` аргумент будет передан просто перемещением, `mut` сделает его изменяемым только внутри функции (аналогично с обычными `let mut` объявлениями).
Если ты хочешь присвоить результат обобщенного умножения переменной типа T, то надо явно потребовать у типажа умножения Output соответвующего типа: `Mul`.
Так же, если ты хочешь использоват разыменования (`*`), надо потребовать типаж `Copy`.
use std::ops::Mul;
fn square_elements<T: Mul<Output=T> + Copy>(data: &mut [T]) {
for i in data.iter_mut() {
*i = *i * *i;
}
}
fn main() {
let mut v: Vec<f64> = vec![0.10, 20.60, 17.7];
println!("before: {:?}", v);
square_elements(&mut v);
println!("after: {:?}", v);
}
playground