Можно ли избежать ключевого слова Rust? - PullRequest
2 голосов
/ 08 октября 2019

Почему у Rust ключевое слово ref? Не может ли

match value.try_thing() {
    &Some(ref e) => do_stuff(e),
    // ...
}

быть равно выражено

match value.try_thing() {
    &Some(e) => do_stuff(&e),
    // ...
}

1 Ответ

5 голосов
/ 08 октября 2019

Нет, этого не избежать с помощью предложенного вами синтаксиса. Ваш синтаксис не позволяет использовать ссылку, если в противном случае было бы допустимо перемещение. В этом примере inner является копией целого числа из val, и его изменение не влияет на val:

fn main() {
    let mut val = Some(42);

    if let &mut Some(mut inner) = &mut val {
        inner += 1;
    }

    println!("{:?}", val); // Some(42)
}

Ключевое слово ref необходимо для принудительного получения ссылки:

fn main() {
    let mut val = Some(42);

    if let &mut Some(ref mut inner) = &mut val {
        *inner += 1;
    }

    println!("{:?}", val); // Some(43)
}

Соответствие эргономике позволяет написать это более простым способом:

fn main() {
    let mut val = Some(42);

    if let Some(inner) = &mut val {
        *inner += 1;
    }

    println!("{:?}", val);
}

Однако, если бы мы начинали только с этим синтаксисом, то, вероятно, имели быпротивоположная проблема и ключевое слово, одно, чтобы заставить движение вместо;возможно Some(move inner). В этой альтернативной вселенной будет задан вопрос, можно ли избежать ключевого слова move.

См. Также:

...