我意识到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上使用匹配语句根本不可能?如果是前者,我还需要改变什么?
答案 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
关键字借入切片(以及任何其他模式),使first
和last
都引用&~str
类型。
有人可能想知道为什么*first
和*last
取消引用并不试图将~str
从&~str
后面移出,但是它是因为println!
宏正在扩展到基本上&*first
和&*last
,这很好。
(我们也可以写=> (first_arg.as_slice(), last_arg.as_slice())
来直接借用两个&~str
字符串切片&str
,这意味着我们不需要在{{1}中取消引用}}。)