Rust 切片上的模式匹配

Rust 切片上的模式匹配,rust,matching,Rust,Matching,我做了这样的事情,效果很好: let s = " \"".as_bytes(); let (space, quote) = (s[0], s[1]); 我想做这样的事 &[space, quote] = " \"".as_bytes(); 但它给了我一个错误 切片模式语法是实验性的(见第23121期) 有可能做类似的事情吗?正如错误告诉您的,切片模式语法是实验性的。这意味着要么语义不清楚,要么语法将来可能会改变。因此,您需要编译器的夜间版本,并明确请求该功能: #![feature

我做了这样的事情,效果很好:

let s = " \"".as_bytes();
let (space, quote) = (s[0], s[1]);
我想做这样的事

&[space, quote] = " \"".as_bytes();
但它给了我一个错误

切片模式语法是实验性的(见第23121期)

有可能做类似的事情吗?

正如错误告诉您的,切片模式语法是实验性的。这意味着要么语义不清楚,要么语法将来可能会改变。因此,您需要编译器的夜间版本,并明确请求该功能:

#![feature(slice_patterns)]

fn main() {
    match " \"".as_bytes() {
        &[space, quote] => println!("space: {:?}, quote: {:?}", space, quote),
        _ => println!("the slice lenght is not 2!"),
    }
}
还请注意,无论如何,您不能只写
&[space,quote]=which
,因为有可能
which
的长度不正确。要使模式匹配详尽无遗,您需要一个
\uu
案例或一个带有
的案例。
。您尝试的操作将产生另一个错误:

error[E0005]:本地绑定中的可反驳模式:`&[]`、`&[\]`和`&[\]`未涵盖
-->src/main.rs:4:9
|
4 |让&[space,quote]=“\”。以字节形式();
|^^^^^^^^^^^^^^^^^^^^^^^^^模式`&[]`、`&[]`和`&[\]`未涵盖
|
=注意:`let`绑定需要一个“无可辩驳的模式”,比如只有一个变量的`struct`或`enum`
=注:有关更多信息,请访问https://doc.rust-lang.org/book/ch18-02-refutability.html
帮助:您可能希望使用'if let'忽略不匹配的变体
|
4 |如果让&[space,quote]=“\”。作为_字节(){/**/}

到目前为止,您可以在数组而不是切片上进行模式匹配。如果您需要,则可以在其上进行匹配:

use std::convert::TryInto;

fn main() {
    let bytes = " \"".as_bytes();

    let bytes: &[_; 2] = bytes.try_into().expect("Must have exactly two bytes");
    let &[space, quote] = bytes;

    println!("space: {:?}, quote: {:?}", space, quote);
}

正如错误中所描述的,语法是实验性的,所以现在最好不要使用它。为什么要使用切片模式?这是否意味着它尚未实现?我发现我不需要再做了,因为我找到了更好的解决方案。然而,我仍然好奇为什么它不起作用。有一天我可能需要使用它。@x4rkz:实验性意味着它还没有决定是按原样实现、以另一种方式实现还是根本不实现。它在不断变化。它已经实现了,但是语义随时可能改变。为了防止意外地破坏代码,您需要显式地告诉编译器选择使用这些不稳定的功能。您是否查看了错误消息中的说明?