gpt4 book ai didi

rust - 无法修改实现 : "cannot borrow immutable borrowed content as mutable" 中的结构字段

转载 作者:行者123 更新时间:2023-11-29 07:57:03 35 4
gpt4 key购买 nike

我正在尝试实现一个将产生质数的迭代器。我将已经找到的质数存储在 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);

我将 self 声明为 &mut 所以我真的不明白这里出了什么问题以及如何解决它。

最佳答案

你的 PrimesIterator type 包含对 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 }
}
}

关于rust - 无法修改实现 : "cannot borrow immutable borrowed content as mutable" 中的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141637/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com