2016-01-07 46 views
5

我是Rust新手,希望瞭解像借用這樣的概念。我試圖用標準輸入創建一個簡單的二維數組。代碼:如何在Rust中迭代和提取出for循環中的值

use std::io; 

fn main() { 
    let mut values = [["0"; 6]; 6]; // 6 * 6 array 

    // iterate 6 times for user input 
    for i in 0..6 { 
     let mut outputs = String::new(); 
     io::stdin().read_line(&mut outputs).expect(
      "failed to read line", 
     ); 

     // read space separated list 6 numbers. Eg: 5 7 8 4 3 9 
     let values_itr = outputs.trim().split(' '); 
     let mut j = 0; 
     for (_, value) in values_itr.enumerate() { 
      values[i][j] = value; 
      j += 1; 
     } 
    } 
} 

這不會編譯,因爲outputs變量壽命不夠長:

error[E0597]: `outputs` does not live long enough 
    --> src/main.rs:20:5 
    | 
14 |   let values_itr = outputs.trim().split(' '); 
    |       ------- borrow occurs here 
... 
20 |  } 
    | ^`outputs` dropped here while still borrowed 
21 | } 
    | - borrowed value needs to live until here 

如何,我可以得到迭代值從塊到值的數組的?

回答

6

split()給你從原始字符串借用子(串切片),和原來的字符串是從outputs管線6

  1. 字符串切片不能活得比的outputs範圍:當一個循環迭代結束,outputs被釋放。 由於values壽命較長,切片不能存儲在那裏。
  2. 我們不能在outputs修改期間借用outputs片。所以即使在values之前定義了Stringoutputs本身,我們也不能輕易地將來自.split()的字符串切片放入values;修改字符串(讀入它)使片斷無效。

的溶液需要要麼

  • 使用的String嵌套數組,當你從分裂迭代分配元件,使用.to_string()使從&str一個String。我會推薦這個解決方案。 (然而String陣列不是在作爲易於使用,也許這已經要求使用代替Vec
  • 構建的&str嵌套陣列從輸入String借用前閱讀所有輸入。如果嵌套數組是暫時只需要的東西,這很好。

:您可以使用類似vec![vec![String::new(); 6]; 6]代替

+0

這將是理想的,如果我可以解決這個使用數組。但似乎沒有辦法在Rust中創建一個字符串數組。不是嗎?第一種方法適用於矢量。謝謝你的回答..(包括你對IRC的最後評論) 「value是一個&str,來自輸出的子字符串,所以.to_string()爲String分配空間並將子字符串複製到該字符串中,所以value是一個&str(a因爲它不是一個引用,所以它不受借用檢查器或「輸出」的限制。「 – vimukthi

+0

沒有*好*的方法來創建一個字符串數組。 '[String :: new(),String :: new(),String :: new(),String :: new(),String :: new(),String :: new()],[String :: new(),String :: new(),String :: new(),String :: new(),String :: new(),String :: new()],...]'當然不好。 – bluss

1

這個答案是從的問題,它解決了有機磷農藥的需求移動。

use std::io; 

fn main() { 
    let mut values = vec![vec![String::new(); 6]; 6]; 
    for i in 0..6 { 
     let mut outputs = String::new(); 
     io::stdin().read_line(&mut outputs) 
       .expect("failed to read line"); 

     let values_itr = outputs.trim().split(' '); 
     let mut j = 0; 
     for (_, value) in values_itr.enumerate() { 
      values[i][j] = value.to_string(); 
      j += 1; 
     } 
    } 
}