簡體   English   中英

不再支持唯一的矢量模式

[英]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關鍵字借入切片(和其他任何模式),使firstlast兩個引用均為&~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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM