2016-07-23 3 views
1

я сделал что-то вроде этого, который работает:шаблон соответствия на кусочки

let s = " \"".as_bytes(); 
let (space, quote) = (s[0], s[1]); 

Я хотел сделать что-то вроде этого

&[space, quote] = " \"".as_bytes(); 

Но это дает мне ошибку

slice pattern syntax is experimental (see issue #23121) 

Можно ли сделать что-то подобное?

+0

Как описано в примере, синтаксис экспериментальный, поэтому лучше не использовать его сейчас. Почему вы хотите использовать шаблон среза? – kennytm

+0

Означает ли это, что оно еще не реализовано? Я получаю, что мне больше не нужно это делать, потому что я нашел лучшее решение для своей проблемы. Однако мне все еще было интересно, почему он не работает. И мне, возможно, придется использовать его когда-нибудь. – x4rkz

+1

@ x4rkz: Экспериментальное означает, что еще не определено, будет ли оно реализовано как есть, реализовано по-другому или вообще не реализовано. Это в движении. –

ответ

4

Как показывает ошибка, синтаксис шаблона среза является экспериментальным. Это означает, что семантика не ясна или синтаксис может измениться в будущем. В результате вы должны каждую ночь версии компилятора и явно запросить эту функцию:

#![feature(slice_patterns)] 

fn main() { 
    match " \"".as_bytes() { 
     &[space, quote] => println!("space: {:?}, quote: {:?}", space, quote), 
     _ => println!("the slice lenght is not 2!"), 
    } 
} 

отметить также, что вы не можете просто написать &[space, quote] = whatever в любом случае, потому что их вероятность того, что whatever не нужной длины. Чтобы шаблон был исчерпывающим, вам нужен случай _ или корпус с ... То, что вы пробовали, даст еще одну ошибку:

let &[space, quote] = " \"".as_bytes(); 
//^gives: error: refutable pattern in local binding: `&[]` not covered [E0005] 
Смежные вопросы