2015-07-02 30 views
3

我是一名Javascript開發人員,正在尋找與Rust合作的遊戲。我讀過Rust編程語言,完成了這些教程,併成功將Rust添加到使用FFI的節點項目中。我想加快我寫的解析器,但認爲我錯過了一個基本的所有權概念。使用正則表達式結果的最佳模式是什麼?

當前的挑戰很簡單:評估一個已命名捕獲的正則表達式,並將該變量的值更改爲新捕獲的值。

我試過這十五種方法,使用unwrap或嵌套Result s和Option s。它總是歸結爲「不夠長」的錯誤。

我最近的代碼如下所示:

let flag_re = compile_re(r"(?:\s*)([~])(?:\s*)(?P<FLAG>.)"); 

let mut flag : &str = "V"; 

for line in file.lines() { 

    let mut current_line : String = line.unwrap(); 

    if flag_re.is_match(&current_line) { 

     let new_flag = &flag_re.captures(&current_line).unwrap().name("FLAG").unwrap().clone(); 

     println!("old flag: {} new flag: {}",flag,new_flag); 

     flag = new_flag; 

    } 

如果我註釋掉flag = new_flag線這個偉大的工程。但是,一旦我嘗試給flag分配一個值,我就會得到一個'活得不夠長'的變量current_line。我得到那current_line是短命的,所以我試過cloneto_owned沒有運氣,並導致我確信我對概念有一些誤解。

我嘗試使用此代碼創建此的防鏽操場:

fn main() { 
    let mut a: &str; 
    { 
    let b: &str = "B"; 
    a = b; 
    } 
    println!("a: {} ",a); 
} 

但是(你不知道)這工作?所以請對這個Javascript小夥很溫柔。

回答

2

問題是new_flag是從line借來的。也就是說,new_flag可以只有存在,只要line繼續存在。一旦你脫離循環,line將被銷燬。

處理這種情況最簡單的方法是從借來的字符串(&str)切換到擁有字符串(String)。也就是說,你需要一個擁有其內容的價值,以便在遊戲中不存在借款。適當的修改是:

let mut flag = String::from("V"); // One way of constructing a String from a &str 
... 
    flag = new_flag.into(); // Another way, using inference 

一個稍微更有效的替代方案是使用std::borrow::Cow,但這是在這種情況下可能是不必要的。

+0

謝謝。更改爲字符串的作品。我確實不得不使用:'flag = new_flag。** to_string()**。into();''我假設這是由於new_flag的乘積是一個&str。 – jdungan

+0

更正:.to_string()是不必要的。注意new_flag賦值中的錯誤&。對不起,感到困惑,並再次感謝您的幫助。 – jdungan

相關問題