不再支持唯一的矢量模式

时间:2014-04-04 21:58:15

标签: pattern-matching rust rust-0.9

我意识到Rust正在变化,但无论如何我还是想学习它。我试图理解如何使用以下与0.9一起工作的示例进行调整,使其与0.10相似:

fn main() {
    let argv = std::os::args();

    let (first, last) = match argv {
        [_, first_arg, .., last_arg] => (first_arg, last_arg),
        _ => fail!("Error: At least two arguments expected.")
    };

    println!("The first argument was {:s}, \
              and the last argument was {:s}.", first, last); 
}

当我用0.10构建它时,我收到以下错误:

error: couldn't read test.rc: no such file or directory (No such file or directory)
orflongpmacx8:rust pohl_longsine$ rustc test.rs
test.rs:9:9: 9:37 error: unique vector patterns are no longer supported
test.rs:9         [_, first_arg, .., last_arg] => (first_arg, last_arg),
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

我的问题:是否仍然可以在argv上使用模式匹配,但语法不同,或者在argv上使用匹配语句根本不可能?如果是前者,我还需要改变什么?

1 个答案:

答案 0 :(得分:4)

您仍然可以匹配切片&[T]和固定长度数组[T, .. n]。所以,在这种情况下,

fn main() {
    let argv = std::os::args();

    let (first, last) = match argv.as_slice() {
        [_, ref first_arg, .., ref last_arg] => (first_arg, last_arg),
        _ => fail!("Error: At least two arguments expected.")
    };

    println!("The first argument was {:s}, \
              and the last argument was {:s}.", *first, *last); 
}

请注意添加ref s。 argv~[~str],即内容属于字符串~str,当按[_, first_arg, .., last_arg]模式传递值时,它会移动所有权。将所有权从借用的指针(如切片&[~str])后面移出是非法的,因此该模式将是非法的。可以使用ref关键字借入切片(以及任何其他模式),使firstlast都引用&~str类型。

有人可能想知道为什么*first*last取消引用并不试图将~str&~str后面移出,但是它是因为println!宏正在扩展到基本上&*first&*last,这很好。

(我们也可以写=> (first_arg.as_slice(), last_arg.as_slice())来直接借用两个&~str字符串切片&str,这意味着我们不需要在{{1}中取消引用}}。)