[英]unique vector patterns are no longer supported
我意識到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上不再使用match語句? 如果是前者,我將不得不改變什么?
您仍然可以在切片&[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
的添加。 argv
是~[~str]
即內容擁有串~str
,其中,當按值傳遞一個移動所有權[_, first_arg, .., last_arg]
模式會怎么做。 將所有權從借來的指針(例如slice &[~str]
)后面移出是非法的,因此該模式將是非法的。 可以使用ref
關鍵字借入切片(和其他任何模式),使first
和last
兩個引用均為&~str
類型。
也許有人會奇怪為什么*first
和*last
取消引用沒有嘗試將~str
從&~str
后面移出,但這是因為println!
宏實際上擴展為&*first
和&*last
,這很好。
(我們也可以編寫=> (first_arg.as_slice(), last_arg.as_slice())
以將兩個&~str
=> (first_arg.as_slice(), last_arg.as_slice())
直接借給字符串切片&str
,這意味着我們不需要在println!
取消引用println!
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.