Как можно избежать использования ключевого слова ref при сопоставлении с образцом в функции, принимающей & self или & mut self? - PullRequest
1 голос
/ 13 марта 2019

В Rust book ключевое слово ref называется "legacy" .Поскольку я хочу следовать неявному совету, чтобы избежать ref, как я могу это сделать в следующем примере с игрушкой?Вы можете найти код также на детской площадке .

struct OwnBox(i32);

impl OwnBox {
    fn ref_mut(&mut self) -> &mut i32 {
        match *self {
            OwnBox(ref mut i) => i,
        }

        // This doesn't work. -- Even not, if the signature of the signature of the function is
        // adapted to take an explcit lifetime 'a and use it here like `&'a mut i`.
        // match *self {
        //     OwnBox(mut i) => &mut i,
        // }

        // This doesn't work
        // match self {
        //     &mut OwnBox(mut i) => &mut i,
        // }
    }
}

1 Ответ

5 голосов
/ 13 марта 2019

Поскольку self относится к типу &mut Self, этого достаточно для сопоставления с самим собой, при этом пропуская ref полностью.Либо разыменование его с помощью *self, либо добавление & к ответной руке вызовет нежелательный ход.

fn ref_mut(&mut self) -> &mut i32 {
    match self {
        OwnBox(i) => i,
    }
}

Однако для таких новых типов, как этот, достаточно было бы &mut self.0.

Это благодаря RFC 2005 - Эргономика соответствия .

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