如何在模式匹配中使用 box 关键字?
How do I use the box keyword in pattern matching?
此代码显示在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
您正在使用 #[feature]
,而这些只能与 nightly Rust compiler 一起使用。我认为目前无法在稳定的 Rust 中与 Box
匹配,但 nightly 允许使用以下方式进行匹配(就像您一开始尝试的那样):
#![feature(box_patterns)]
fn main() {
let b = Some(Box::new(5));
match b {
Some(box y) => print!("{:?}", y),
_ => print!("{:?}", 1),
}
}
Rust 有 three release channels: stable, beta, and nightly.
稳定版是主要版本,Rust 开发人员会注意确保对稳定频道所做的功能和更新非常稳定。这意味着它们已完全实现并且可以安全使用,但最重要的是,当 Rust 开发人员将功能添加到稳定版时,这意味着他们正在承诺向后兼容。
向后兼容性承诺很重要,因为这意味着开发人员可以开始使用库中的稳定功能,而不必担心在语言更新时他们是否必须从头开始重写大部分库。
Rust 中还有其他可用的功能,例如 box
语法,尚未完全确定。其中许多具有部分或接近完整的实现,但它们的确切语法和实现仍可能发生变化。由于这些功能不被认为是稳定的,因此它们可能会受到 backwards-incompatible 更改的影响,如果您依赖它们,可能会破坏您现有的代码。
例如,对于所谓的 "placement new"(避免需要先在堆栈上分配然后复制到堆)的语法有两个建议:
in PLACE { BLOCK }
PLACE <- EXPR
当 placement new 达到稳定状态时,将只有一种语法可用。然而,在开发过程中,Rust 团队可能会尝试多种做事方式,并根据他们认为合适的方式进行更改。任何使用不稳定功能的人都必须在编译器或语言 API 发生变化时更新他们的代码。
但有时人们想冒这个风险,并利用稳定版本中尚不可用的功能,因为他们知道他们的代码可能会被未来的版本破坏。
为此,有夜间发布。这是编译器的一个版本,构建时启用了不稳定的功能和 API。如果您使用每晚发布的版本,则可以使用 box
语法和其他各种尚未准备好稳定发布的功能。
可能获得每晚构建以及在每晚和稳定版本之间切换的最简单方法是使用 rustup.
安装 rust
Rustup 使安装针对不同平台的 Rust 编译器以及在稳定版、夜间版和测试版之间切换变得容易。
此代码显示在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
您正在使用 #[feature]
,而这些只能与 nightly Rust compiler 一起使用。我认为目前无法在稳定的 Rust 中与 Box
匹配,但 nightly 允许使用以下方式进行匹配(就像您一开始尝试的那样):
#![feature(box_patterns)]
fn main() {
let b = Some(Box::new(5));
match b {
Some(box y) => print!("{:?}", y),
_ => print!("{:?}", 1),
}
}
Rust 有 three release channels: stable, beta, and nightly.
稳定版是主要版本,Rust 开发人员会注意确保对稳定频道所做的功能和更新非常稳定。这意味着它们已完全实现并且可以安全使用,但最重要的是,当 Rust 开发人员将功能添加到稳定版时,这意味着他们正在承诺向后兼容。
向后兼容性承诺很重要,因为这意味着开发人员可以开始使用库中的稳定功能,而不必担心在语言更新时他们是否必须从头开始重写大部分库。
Rust 中还有其他可用的功能,例如 box
语法,尚未完全确定。其中许多具有部分或接近完整的实现,但它们的确切语法和实现仍可能发生变化。由于这些功能不被认为是稳定的,因此它们可能会受到 backwards-incompatible 更改的影响,如果您依赖它们,可能会破坏您现有的代码。
例如,对于所谓的 "placement new"(避免需要先在堆栈上分配然后复制到堆)的语法有两个建议:
in PLACE { BLOCK }
PLACE <- EXPR
当 placement new 达到稳定状态时,将只有一种语法可用。然而,在开发过程中,Rust 团队可能会尝试多种做事方式,并根据他们认为合适的方式进行更改。任何使用不稳定功能的人都必须在编译器或语言 API 发生变化时更新他们的代码。
但有时人们想冒这个风险,并利用稳定版本中尚不可用的功能,因为他们知道他们的代码可能会被未来的版本破坏。
为此,有夜间发布。这是编译器的一个版本,构建时启用了不稳定的功能和 API。如果您使用每晚发布的版本,则可以使用 box
语法和其他各种尚未准备好稳定发布的功能。
可能获得每晚构建以及在每晚和稳定版本之间切换的最简单方法是使用 rustup.
安装 rustRustup 使安装针对不同平台的 Rust 编译器以及在稳定版、夜间版和测试版之间切换变得容易。