2015-04-28 42 views
1

req.url.fragment是可選的String。如果它有一個值,我想將該值複製到fragment,否則我想分配一個空字符串。我不斷收到錯誤,我cannot move out of borrowed content匹配字符串:無法移出借用內容

我該如何解決這個問題?

fn fb_token(req: &mut Request) -> IronResult<Response> { 
    let fragment = match req.url.fragment { 
     Some(fragment) => fragment, 
     None => "".to_string(), 
    }; 

    Ok(Response::with((status::Ok, fragment))) 
} 

回答

8

這取決於你想要對結構中現有的字符串做什麼。

let fragment = match req.url.fragment { 
    Some(fragment) => fragment, 
    None => "".to_string(), 
}; 

在這段代碼中,你是移動的串出的req.url.fragment,但這會讓其處於不確定狀態。這是一件壞事,Rust會阻止你這樣做!

隨着錯誤消息指出:

防止移動,使用ref fragmentref mut fragment參照

獲取價值。如果你想離開它是字符串,返回副本,那麼你可以參考然後克隆它:

let fragment = match req.url { 
    Some(ref fragment) => fragment.clone(), 
    None => "".to_string() 
}; 

如果你想離開現有的字符串作爲None,那麼你可以使用take

let fragment = match req.url.take() { 
    Some(fragment) => fragment, 
    None => "".to_string() 
}; 

更短,您可以使用unwrap_or_else

let fragment = req.url.take().unwrap_or_else(String::new); 
+0

我的確瞭解了借用凍結引用對象的事情,這意味着在這種情況下不允許移動,但我無法弄清楚如何避免移動。顯然,我需要修改一些概念並更仔細地閱讀文檔。謝謝你的幫助 :) –

2

這裏的問題是,人們可以不壞一個&mut參考和移動擁有了一個辦法無效。 (有一個在右側邊欄幾個環節,以類似的問題/解答。)

一個修復程序,而不是使用引用,應在這種情況下工作得非常好:

fn fb_token(req: &mut Request) -> IronResult<Response> { 
    let fragment: &str = match req.url.fragment { 
     Some(ref fragment) => &**fragment, 
     None => "", 
    }; 

    Ok(Response::with((status::Ok, fragment))) 
} 

(該&str註釋沒有必要,只是爲了使它更清楚發生了什麼。)

這是可行的,因爲iron implements Modifier<Response> for &str,所以這種類型可以使用with而不是擁有String