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

10

以下代码摘自 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
你已经阅读了整本《Rust Book》,并到达了第6.8章关于box语法的部分,但是你没有阅读第6章介绍夜间版Rust的内容,其中描述了你问题的前2/3部分? - Shepmaster
@S 你说得对。我刚才直接跳到了 Rust 的语法部分。看来介绍也很重要... - Eva Red
2个回答

14

您正在使用一个 #[feature] ,这些特性只能与夜间版的 Rust 编译器一起使用。我认为在稳定版的 Rust 中目前无法匹配一个Box,但是夜间版允许以以下方式完成(就像您最初尝试的那样):

#![feature(box_patterns)]

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

啊哈。如果我不使用match,还有其他方法可以获取盒子中的内容吗? - Eva Red
1
是的,你只需要使用星号对它进行取消引用,例如 assert_eq!(*Box::new(1), 1); - ljedrz

5
Rust有三个发行通道:稳定版、测试版和夜间版
稳定版是主要发布版本,Rust开发人员确保稳定通道的功能和更新是稳定的。这意味着它们被完全实现并且可以安全使用,但最重要的是,当Rust开发人员将一个功能添加到稳定版时,这意味着他们正在承诺向后兼容性。
向后兼容性承诺很重要,因为它意味着开发人员可以开始在库中使用稳定功能,而不必担心在语言更新时是否必须从头重写库的大部分内容。
Rust还提供了其他功能,例如box语法,尚未完全确定。其中许多具有部分或几乎完整的实现,但其确切的语法和实现仍可能发生变化。因为这些功能不被认为是稳定的,所以它们可能受到向后不兼容的更改的影响,如果您依赖它们,可能会破坏您现有的代码。
例如,有两个关于语法的提案,称为“放置新”(避免首先在堆栈上分配然后复制到堆):
in PLACE { BLOCK }
PLACE <- EXPR

当placement new达到稳定状态时,只有一种语法可用。但在开发过程中,Rust团队可能会尝试多种方法,并根据需要进行更改。使用不稳定的功能的任何人都必须在编译器或语言API更改时更新其代码。
但有时人们想冒这个险,并利用尚未在稳定版本中提供的功能,知道它们的代码可能会被未来的发布破坏。
为此,有夜间发布版本。这是一个使用不稳定的功能和API构建的编译器版本。如果您使用夜间发布版,则可以使用box语法和许多其他未准备好稳定发布的功能。
可能最简单的获取夜间版本并在稳定版和夜间版之间切换的方法是使用rustup安装Rust。
Rustup使得安装针对不同平台的Rust编译器以及在稳定、夜间和beta发布之间切换变得容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接