Как использовать ключевое слово box в сопоставлении с образцом?


person Eva Red    schedule 11.02.2017    source источник
comment
Вы прочитали всю книгу Rust, дошли до главы 6.8 о синтаксисе box, но не прочитали введение в главу 6, озаглавленную Nightly Rust, который описывает первые 2/3 вашего вопроса?   -  person Shepmaster    schedule 11.02.2017
comment
@S Ты прав. Я просто перешел к синтаксису Rust. Кажется, что вступление тоже важно...   -  person Eva Red    schedule 11.02.2017


Ответы (2)


Вы используете #[feature], и их можно использовать только с ночным компилятором Rust. Я не думаю, что в настоящее время возможно сопоставить Box в стабильном Rust, но nightly позволяет сделать это следующим образом (как вы пытались в начале):

#![feature(box_patterns)]

fn main() {
    let b = Some(Box::new(5));
    match b {
        Some(box y) => print!("{:?}", y),
        _ => print!("{:?}", 1),
    }
}
person ljedrz    schedule 11.02.2017
comment
Ах ха. Итак, если я не использую match, есть ли другой способ получить содержимое в Box? - person Eva Red; 11.02.2017
comment
Да; вам просто нужно разыменовать его звездочкой, например. assert_eq!(*Box::new(1), 1); - person ljedrz; 11.02.2017
comment
понятно. Благодарить:) - person Eva Red; 11.02.2017

У Rust есть три канала выпуска: стабильный, бета-версия и ночная версия.

Stable — это основной выпуск, и разработчики Rust заботятся о том, чтобы функции и обновления, сделанные в стабильном канале, были стабильными. Это означает, что они полностью реализованы и безопасны в использовании, но самое главное, когда разработчики Rust добавляют функцию в стабильную версию, это означает, что они берут на себя обязательства по обеспечению обратной совместимости.

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

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

Например, есть или были два предложения по синтаксису для того, что называется «размещение нового» (избегая необходимости сначала выделять в стеке, а затем копировать в кучу):

in PLACE { BLOCK }
PLACE <- EXPR

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

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

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

Вероятно, самый простой способ получить ночную сборку и переключиться между ночным и стабильным выпусками — это установить ржавчину с помощью ржавчина.

Rustup позволяет легко устанавливать компиляторы Rust для разных платформ и переключаться между стабильными, ночными и бета-версиями.

person zstewart    schedule 11.02.2017