Как определить универсальную функцию, которая принимает Mutex <T>? - PullRequest
0 голосов
/ 23 декабря 2018

Эта простая функция блокирует f64 и обновляет значение

use std::sync::Mutex;

fn bar() {
    let a = Mutex::new(1.0);
    let mut b = a.lock().unwrap();
    *b = 2.0;
    foo(a, 3.0);
}

Я хотел бы инкапсулировать поведение в функцию, но не могу понять, как задать предложение where для T

fn foo<T, V>(lockable_param: T, value: V)
// where
//    T: Mutex??,
{
    let mut lock = lockable_param.lock().unwrap();
    *lock = value;
}

1 Ответ

0 голосов
/ 23 декабря 2018

Вам не нужно столько параметров, просто используйте Mutex<T> и T для параметров.Я полагаю, вам нужно получить ссылку, а не значение, поскольку вы ничего не возвращаете.Это должно работать:

use std::sync::Mutex;

fn bar() {
    let a = Mutex::new(1.0);
    let mut b = a.lock().unwrap();
    *b = 2.0;
    foo(&a, 3.0);
}

fn foo<T>(lockable_param: &Mutex<T>, value: T) {
    let mut lock = lockable_param.lock().unwrap();
    *lock = value;
}
...