无法从实现中修改结构体字段:"无法将不可变借用的内容作为可变的借用"。

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,所以我不太明白问题出在哪里以及如何修复它。

1个回答

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 }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接