@ziplane

Обобщения. Как возвести в квадрат элементы в векторе?

Доброго времени суток!
Я хочу возвести в квадрат элементы в векторе для этого
let  sim:Vec<f64> = vec![0.10,20.60,17.7];
//создаю цикл и он работает
for i in sim.iter_mut(){
        *i = (*i) + (*i)
    }

теперь я хочу сделать функцию, где можно возводить в квадрат независимо от типа
fn main() {
    let mut sim:Vec<f64> = vec![0.10, 20.60, 17.7];
    quadrat(sim);
}

fn quadrat<T:AddAssign+Add> (mut input:Vec<T>)
{
        //input.iter().map(|n|n*n);
    for  i in input.iter_mut() {
        *i = (*i) + (*i)
    }
}

и он не работает . Можете объяснить или дать ссылку что не так.
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
ozkriff
@ozkriff
Rust э̶н̶т̶у̶з̶и̶а̶с̶т сектант, хобби игродел
Если ты хочешь изменять внешний массив, то его надо принимать по `&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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы