此代码显示在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
答案 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编译器,并在稳定版,夜间版和测试版之间切换。