2017-02-15 65 views
1

我想更新類型爲&str的變量輸入。如何使內部函數返回&str而不是Cow返回&str而不是std :: borrow :: Cow <'_, str>

這可能不是語言問題,但與正則表達式箱。有沒有更簡單的方法?

fn transform_the_expression() { 

    fn create_formula<'t>(input: &'t str, re: Regex) -> std::borrow::Cow<'t, str> { 
     let changed_string = re.replace(input, "1"); 
     return changed_string; 
    } 

    let mut input = "(a+(b*c))"; 
    use regex::Regex; 
    let re = Regex::new(r"\([\w\d][/*+-^][\w\d]\)").unwrap(); 

    println!("input = {:?}", input); 
    input = create_formula(input, re); 
    println!("input = {:?}", input); 
} 
+0

爲什麼,雖然?您可以通過取消引用來從「Cow」中獲取參考。 – ljedrz

+0

@ljedrz:大概是這樣'input = create_formula(input,re);'起作用。 –

回答

7

不能


鏽的基石是所有權,這是你需要了解的概念。

一個&str借用但不自己,它指的是一塊內存,別人擁有。借用檢查器將在編譯時確保擁有所涉及的存儲器的人將生存更長的&str,否則&str將指向以太。

在這種情況下,認爲:

  • String是一隻貓
  • &str是一個手持設備上運行此貓的實況饋送(隨後是一個微型攝像頭無人駕駛飛機)

顯然,你只能有貓的實況饋送只要生活,在這之後,...

而你的問題是問:

如果我殺了貓,我怎麼還能得到活飼料?

你不行。


在你的情況,re.replace創建Cow<'t, str>。如果你看看Cow的定義,你會發現它是:

  • 無論是&str
  • String

這是一個&str如果沒有發生更換隻和否則它是String

你無法靜態地知道它是哪一個,所以你需要考慮「最壞情況」的選擇:把它想象成一個String

這個String的生命週期是什麼:它取決於你是否從函數返回它,如果你不這樣做,它不能超過函數的幀。

如果它沒有超過功能框架,則不能擁有超過功能框架的實時饋送。


那麼,我的建議是使用String。這將是非常簡單:

fn transform_the_expression() { 
    use regex::Regex; 

    fn create_formula(input: &str, re: &Regex) -> String { 
     re.replace(input, "1").into() 
    } 

    let mut input = String::from("(a+(b*c))"); 
    let re = Regex::new(r"\([\w\d][/*+-^][\w\d]\)").unwrap(); 

    println!("input = {:?}", input); 
    input = create_formula(&input, &re); 
    println!("input = {:?}", input); 
} 
+0

謝謝,這非常有幫助。 into()函數似乎被棄用,並被into_owned()取代,至少borrows.rs不包含它。 –

+2

'into'函數有點難找,因爲它自動實現。我建議你查看'std :: convert :: From'和它的邪惡的雙胞胎'std :: convert :: Into':對於X :: from(Y) - > X'的任何實現,你得到一個實現Y ::進入(自己) - > X'自動神奇。 –

相關問題