2015-03-19 38 views
3

我想實現一個迭代器,它將產生素數。我已經在Vec<u64>中找到了素數。無法從實現修改結構字段:「不能借用不可變的借來的內容作爲可變」

這裏是我的實現:

struct Primes { 
    primes: Vec<u64>, 
} 

impl Primes { 
    fn new() -> Primes { 
     Primes { primes: vec!(2, 3) } 
    } 

    fn iter(&self) -> PrimesIterator { 
     PrimesIterator { primes: &self.primes, index : 0 } 
    } 
} 

struct PrimesIterator<'a> { 
    primes: & 'a Vec<u64>, 
    index: usize, 
} 

impl<'a> Iterator for PrimesIterator<'a> { 
    type Item = u64; 

    fn next(&mut self) -> Option<u64> { 
     if self.index < self.primes.len() { 
      let result = self.primes[self.index]; 
      self.index += 1; 
      Some(result) 
     } else { 
      let mut n = *self.primes.last().unwrap(); 
      loop { 
       n += 2; 
       if is_prime(self.primes, n) { 
        self.primes.push(n); 
        self.index += 1; 
        return Some(n); 
       } 
      } 
     } 
    } 
} 

fn is_prime(primes: &[u64], n: u64) -> bool { 
    for &p in primes.iter() { 
     if n % p == 0 { 
      return false; 
     } 
     if p * p > n { 
      return true; 
     } 
    } 
    return false; 
} 

,但是當我試圖編譯它,我收到以下錯誤:

main.rs: error: cannot borrow immutable borrowed content `*self.primes` as mutable 
main.rs:      self.primes.push(n); 

我宣佈自己爲& MUT所以我不我真的明白這裏有什麼問題以及如何解決這個問題。

回答

7

您的PrimesIterator類型包含對Vec<u64>的不可變引用。您需要將其聲明爲一個可變參考:

struct PrimesIterator<'a> { 
    primes: &'a mut Vec<u64>, 
    index: usize, 
} 

當然這需要你同時修改iter()功能,以確保它可以通過一個可變參考:

impl Primes { 
    fn new() -> Primes { 
     Primes { primes: vec!(2, 3) } 
    } 

    fn iter(&mut self) -> PrimesIterator { 
     PrimesIterator { primes: &mut self.primes, index : 0 } 
    } 
} 
相關問題