如何在模式匹配中使用box关键字?

时间:2017-02-11 14:50:22

标签: rust pattern-matching boxing

此代码显示在The Rust Programming Language

#![feature(box_syntax, box_patterns)]

fn main() {
    let b = Some(box 5);
    match b {
        Some(box n) if n < 0 => {
            println!("Box contains negative number {}", n);
        }
        Some(box n) if n >= 0 => {
            println!("Box contains non-negative number {}", n);
        }
        None => {
            println!("No box");
        }
        _ => unreachable!(),
    }
}

但是当我运行它时,会发生以下错误:

error[E0554]: #[feature] may not be used on the stable release channel

我也试过

fn main() {
    let b = Some(box 5);
}
error: box expression syntax is experimental; 

是因为我的Rust版本不是最新的吗?如何在Box::new()中获取内容?我试过了

fn main() {
    let b = Some(Box::new(5));
    match b {
        Some(Box::new(y)) => print!("{:?}", y), 

        _ => print!("{:?}", 1),
    }
}
error[E0164]: `Box::new` does not name a tuple variant or a tuple struct
--> main.rs:6:14
  |
6 |         Some(Box::new(y)) => print!("{:?}", y), 
  |              ^^^^^^^^^^^ not a tuple variant or struct

2 个答案:

答案 0 :(得分:7)

您使用的是#[feature],而这些只能与nightly Rust compiler一起使用。我认为目前无法与稳定的Rust中的Box进行匹配,但是每晚都可以采用以下方式(就像您在开始时尝试的那样):

#![feature(box_patterns)]

fn main() {
    let b = Some(Box::new(5));
    match b {
        Some(box y) => print!("{:?}", y),
        _ => print!("{:?}", 1),
    }
}

答案 1 :(得分:5)

Rust有three release channels: stable, beta, and nightly

稳定是主要版本,Rust开发人员注意确保稳定通道的功能和更新是稳定的。这意味着它们已经完全实现并且可以安全使用,但最重要的是,当Rust开发人员向稳定版添加功能时,这意味着他们承诺向后兼容。

向后兼容性承诺非常重要,因为这意味着开发人员可以开始在库中使用稳定的功能,而不必担心在语言更新时他们是否必须从头开始重写其大部分库。

Rust中还有其他功能,例如box语法,但尚未完全确定。其中许多都有部分或接近完整的实现,但它们的确切语法和实现仍有可能发生变化。由于这些功能不被认为是稳定的,因此它们可能会受到向后不兼容的更改,如果您依赖它们,可能会破坏现有代码。

例如,有两个关于什么称为&#34; placement new&#34;的语法的提议。 (避免首先在堆栈上分配然后复制到堆):

in PLACE { BLOCK }
PLACE <- EXPR

当展示位置达到稳定时,只有一种语法可用。但是,在开发过程中,Rust团队可以尝试多种方式,并根据需要进行更改。任何使用不稳定功能的人都必须在编译器或语言API发生变化时更新代码。

但有时人们希望承担这种风险,并利用稳定版本中尚未提供的功能,因为他们知道未来的版本可能会破坏他们的代码。

为此,每晚都会发布。这是使用不稳定功能和API构建的编译器版本。如果您使用每晚版本,则可以使用box语法和各种其他未被认为可以稳定发布的功能。

使用rustup安装生锈的最简单方法可能是每晚构建,以及在夜间和稳定版本之间切换。

Rustup可以轻松安装针对不同平台的Rust编译器,并在稳定版,夜间版和测试版之间切换。