2017-07-02 71 views
0

我有一個結構類似這樣的一些分析論證工作修改:結構更新語法不借來的數據

fn parse(parsed: &Args, start: usize, args: Vec<String>) -> Args { 
    if start >= args.len() { 
     return parsed.clone(); 
    } 

    if args[start] == "--version" { 
     return parse(&Args { version: true, ..parsed.clone() }, start + 1, args); 
    } 
    if args[start] == "--help" { 
     return parse(&Args { help: true, ..parsed.clone() }, start + 1, args); 
    } 
    return Args { files: args[start..args.len()].to_vec(), ..parsed.clone() }; 
} 

我使用的功能是這樣的:

fn main() { 
    let args = std::env::args().collect::<Vec<String>>(); 
    let parsed = parse(&Args::default(), 1, args); 
} 

此代碼工作原理,但我想鍵入:

return parse(&Args { version: true, ..parsed }, start + 1, args); 

代替:

return parse(&Args { version: true, ..parsed.clone() }, start + 1, args); 

避免克隆過程中的過度複製數據。當我剛刪除.clone()它表示Args類型的預期,但它取而代之&Args

當我提領與*parsed編譯器說:「不能搬出借來的內容的」

+0

你是否考慮過不通過引用傳遞'parsed'參數? – loganfsmyth

+0

@loganfsmyth是的,這就是我最終的結局。不克隆的速度增益大約是7%。 – konmik

回答

2

當一個類型TClone然後在&T調用clone()也將返回一個T,因爲沒有僅僅複製指針指向。實際上,如果確實克隆了基礎數據,然後返回了對它的引用,那麼你會遇到麻煩,因爲T將被丟棄,使指針懸而未決。

要將&T轉換爲T,您可以使用*運算符對其進行取消引用。但是,這會給您帶來問題,因爲是parse函數借用的,這意味着它必須在完成時將其還原。如果您取消引用並移動這些值,那麼您將會移出借用的上下文。

+0

解引用不起作用 - 它說「無法移出借用的內容」。 – konmik

+0

_這就是我所說的!_我的觀點可能有些偏斜,但這個錯誤應該告訴你一些事情。你或者需要首先將對象移動到'parse'中,而不是傳遞引用,否則你會被克隆。 –

+0

如果我們能夠在這個地方接受一個借來的參考資料,我們可以讓鐵鏽生鏽 - 我沒有看到爲什麼沒有理由。 – konmik