首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在模式匹配中使用box关键字?

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

Stack Overflow用户
提问于 2017-02-11 14:50:21
回答 2查看 6.3K关注 0票数 9

此代码在https://doc.rust-lang.org/stable/book/box-syntax-and-patterns.html中显示。

代码语言:javascript
复制
#![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!(),
    }
}

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

代码语言:javascript
复制
error[E0554]: #[feature] may not be used on the stable release channel

我也试过

代码语言:javascript
复制
fn main() {
    let b = Some(box 5);
}
代码语言:javascript
复制
error: box expression syntax is experimental; 

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

代码语言:javascript
复制
fn main() {
    let b = Some(Box::new(5));
    match b {
        Some(Box::new(y)) => print!("{:?}", y), 

        _ => print!("{:?}", 1),
    }
}
代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-11 15:05:53

您使用的是#[feature],而这些只能与夜间锈蚀编译器一起使用。我认为目前无法在稳定锈蚀中与Box相匹配,但夜间允许使用以下方法(就像您在开始时尝试的那样):

代码语言:javascript
复制
#![feature(box_patterns)]

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

Stack Overflow用户

发布于 2017-02-11 15:11:00

铁锈有三个发布通道:稳定的、beta的和夜间的

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

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

在Rust中还有其他可用的特性,例如box语法,这些特性还没有完全完成。其中许多都有部分或几乎完全的实现,但它们的确切语法和实现仍有待更改。因为这些特性被认为是不稳定的,因此它们可能会受到不兼容的逆向更改,如果您依赖它们,这些更改可能会破坏您现有的代码。

例如,对于所谓的“放置新”(避免首先在堆栈上分配,然后复制到堆),有两种语法建议:

代码语言:javascript
复制
in PLACE { BLOCK }
PLACE <- EXPR

当放置新的到达稳定,只有一个语法将可用。然而,在开发过程中,Rust团队可能会尝试多种方法来做事情,并根据自己的意愿改变它们。任何使用不稳定特性的人都必须在编译器或语言API更改时更新他们的代码。

但有时人们想冒这个风险,并利用稳定版本中尚未提供的特性,因为他们知道自己的代码可能会被未来的版本破坏。

对此,有夜间发布。这是编译器的一个版本,它使用启用的不稳定特性和API构建。如果您使用夜间发行版,您可以使用box语法和其他各种特性,这些特性还没有准备好进行稳定发布。

可能获得夜间构建以及在夜间版本和稳定版本之间切换的最简单方法是使用沙沙安装锈蚀。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42177226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档