Можно ли создать оболочку вокруг & mut, которая действует как & mut - PullRequest
2 голосов
/ 26 октября 2019

Следующий код не может быть скомпилирован, потому что MutRef не Copy. Невозможно сделать копию, потому что &'a mut i32 не является копией. Есть ли способ придать MutRef семантику, аналогичную &'a mut i32?

Мотивация для этого заключается в возможности упаковки большого набора параметров функции в структуру, чтобы их можно было передавать в виде группы вместо необходимостидля индивидуальной передачи.

struct MutRef<'a> {
    v: &'a mut i32
}

fn wrapper_use(s: MutRef) {
}

fn raw_use(s: &mut i32) {
}

fn raw_ref() {
    let mut s: i32 = 9;
    let q = &mut s;
    raw_use(q);
    raw_use(q);

}

fn wrapper() {
    let mut s: i32 = 9;
    let q = MutRef{ v: &mut s };
    wrapper_use(q);
    wrapper_use(q);
}

1 Ответ

2 голосов
/ 26 октября 2019

Нет.

Имя этой функции - "неявное повторное заимствование", и это происходит, когда вы передаете ссылку &mut, когда компилятор ожидает ссылку &mut, возможно, с другим временем жизни. Компилятор неявно перезагружается только тогда, когда фактический тип и ожидаемый тип являются &mut ссылками. Он не работает с универсальными аргументами или структурами, содержащими &mut ссылки. В текущем Rust нет способа создать пользовательский тип, который может быть неявно переназначен.

См. Также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...